7

我正在尝试使用 IP 地址 SAN 创建一个请求。这是负责创建 CAalternativeName 的函数:

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)

我究竟做错了什么?

4

1 回答 1

6

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);

就像埃舍尔的艺术品一样直观。

** 来源:http: //msdn.microsoft.com/en-us/library/windows/desktop/aa375024%28v=vs.85%29.aspx

于 2014-09-03T09:31:07.380 回答