我尝试使用IP地址SAN创建请求。这是负责创建CAlternativeName的函数:
public static CAlternativeNameClass GetCurrentIpName() {
//get current machine IP address
IPAddress ip = GetCurrentIp();
if (ip == null) {
return null;
}
try {
CAlternativeNameClass nameClass = new CAlternativeNameClass();
nameClass.InitializeFromString(AlternativeNameType.XCN_CERT_ALT_NAME_IP_ADDRESS, ip.ToString());
return nameClass;
} catch (Exception e) {
Console.WriteLine(e);
return null;
}
}
问题在于我收到了下一个错误:
System.ArgumentException: Value does not fall within the expected range.
at CERTENROLLLib.CAlternativeNameClass.InitializeFromString(AlternativeNameType Type, String strValue)
我做错了什么?
答案 0 :(得分:5)
InitializeFromString不接受XCN_CERT_ALT_NAME_IP_ADDRESS **的AlternativeNameType。您必须使用 InitializeFromRawData 。这个错误有点用词不当,因为它实际上并不是值参数,而是类型,但是嘿。
InitializeFromRawData接受一个字符串作为输入(因为这是Microsoft,而不是Ronseal),因此您需要将原始数据编码为字符串,以便它可以再次将其转换为原始数据:
String ipBase64 = Convert.ToBase64String(ip.GetAddressBytes());
nameClass.InitializeFromRawData(AlternativeNameType.XCN_CERT_ALT_NAME_IP_ADDRESS, EncodingType.XCN_CRYPT_STRING_BASE64, ipBase64);
与Escher艺术品一样直观。
**来源:http://msdn.microsoft.com/en-us/library/windows/desktop/aa375024%28v=vs.85%29.aspx