【问题标题】:C# DTLS Certificate Verify MessageC# DTLS 证书验证消息
【发布时间】:2019-09-10 21:30:21
【问题描述】:

我需要开始使用 SNMPv3 而不是 DTLS 和 c# 中的 windows 证书存储区中的证书,从我目前所见,这根本不经常使用。不幸的是,我在这件事上别无选择。

我正在使用DTLS.NET 进行握手。一个技巧是DTLS.NET 似乎想要一个pem 文件而不是来自Windows 证书存储的X509 Certificate。我相信我已经想出了如何加载证书,除了私钥。私钥不可导出,我不相信我可以改变它。

public void LoadX509Certificate(X509Certificate2 certificate)
{
    if (certificate == null)
    {
        throw new ArgumentNullException(nameof(certificate));
    }

    this._PrivateKey = DotNetUtilities.GetKeyPair(certificate.PrivateKey).Private;

    this._Certificate = new Certificate
    {
        CertChain = new List<byte[]>() { certificate.RawData },
        CertificateType = TCertificateType.X509
    };
}

我相信我已经弄清楚了证书验证消息,而这似乎是需要私钥的地方。

CertificateVerify certificateVerify = new CertificateVerify();
byte[] signatureHash = _HandshakeInfo.GetHash();
certificateVerify.SignatureHashAlgorithm = new SignatureHashAlgorithm() { Signature = TSignatureAlgorithm.ECDSA, Hash = THashAlgorithm.SHA256 };
certificateVerify.Signature = TLSUtils.Sign(_PrivateKey, true, _Version, _HandshakeInfo, certificateVerify.SignatureHashAlgorithm, signatureHash);
SendHandshakeMessage(certificateVerify, false);

我似乎在 RFC 或其他地方找不到太多准确描述此处需要发生的事情的信息。我知道服务器可以处理RSADSSECDSA,所以我把它留给ECDSA,因为这是DTLS.NET 使用的。

我真的需要私钥来创建CertificateVerify 消息吗?

提前致谢!

【问题讨论】:

    标签: c# x509certificate private-key dtls


    【解决方案1】:

    握手可以通过它的证书来验证客户端。 虽然它自己的证书是“公开的”,但每个人都可以发送它,并且无法授予身份验证。 因此,客户必须证明他也可以访问私钥。这就是使用“证书验证”消息的原因。

    如果您无权访问证书公钥的私钥,则无法进行客户端证书握手。

    也许密钥库不会导出该私钥,而是提供一个“签名”功能,在该函数中应用该私钥。

    【讨论】:

    • 你是对的!我最终将私钥加载为 RSA (RSACryptoServiceProvider)mainCert.PrivateKey;然后 rsa.SignData(hash, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1);谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多