Windows服务凭据无效的十六进制字符串格式
本文关键字:十六进制 字符串 格式 无效 服务 Windows | 更新日期: 2023-09-27 18:27:58
我正在调试Win服务。我在服务器上添加了一些证书。正在尝试根据证书的序列号查找证书。https://gyazo.com/9cdcda75e98fe7b7c35496976a5aaaeb
行为配置:
<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="DDBS.DDBSPasswordValidator, DDBS" />
<serviceCertificate findValue="1C5411F9D38252824C2EC1CC7E5EBE3F" x509FindType="FindBySerialNumber" storeLocation="LocalMachine" storeName="My" />
</serviceCredentials>
我遇到错误:无法启动服务。System.FormatException:无效的十六进制字符串格式。
来自MSDN论坛上的Jan Angelovič:
如果剪切并粘贴[序列号或指纹]在"通用证书"对话框中,它以UNICODE复制具有特殊不可见控制字符的(UTF-16LE)编码(0xFF和0xFE,又名"字节顺序标记")一串
就我个人而言,我用指纹看到了这一点;剪切&从对话框粘贴到VisualStudio中保留了2个未显示的字符(可以用光标"遍历"并删除)。
删除所有findValue="XXXXXXX",然后再次写入。。有时无效字符在findValue="???<---此处为
在@richaux的解决方案中稍作添加即可解决。";无效的十六进制字符串格式"异常即使在删除空格或手动键入指纹后仍然存在。我把VS 2019的代码行复制到Notepad++上,这就是的样子
client.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.LocalMachine,StoreName.Root,X509FindType.FindByThumbprint,"0f12c34c56fa78901234567e890af123ca45678d")
注意值字符串末尾的字符。此字符在Visual Studio中不可见。我在Notepad++中删除了这个字符,并将从Notepad++复制的行粘贴到VS 2019中。编译并运行此更新的代码删除了";无效的十六进制字符串格式"异常。
使用OpenSSL实用程序生成证书,然后在生产服务器上安装后,我也遇到了同样的问题。问题是当我在生产服务器上检查证书的序列号时它显示了带有空格的十六进制数,这导致了错误。
对我有效的解决方案是首先在您的机器上导入相同的证书,检查其序列号(在我的情况下,它没有空格值),然后我复制该值并粘贴到生产上,然后它就起作用了。
希望这会有所帮助。
@richaux是对的,这是不可见的字符。我从一些Windows对话框中复制了指纹,得到了相同的结果。
为了用c#克服这个问题,我将指纹字符串替换为:
Regex.Replace(clientCertificateFingerprint, @"[^'w'.@-]", "",
RegexOptions.None, TimeSpan.FromSeconds(1.5));
使用FindBySubjectName选项查找。服务很好。