C# DTLS 证书验证消息

C# DTLS Certificate Verify Message

我需要开始使用 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 消息吗?

提前致谢!

握手可以通过其证书对客户端进行身份验证。 虽然它本身的证书是"public",但任何人都可以发送它并且无法进行身份验证。 因此,客户必须证明他也可以访问私钥。这就是使用 "Certificate Verify" 消息的原因。

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

也许密钥库不导出该私钥,而是提供一个 "signing" 函数,其中应用了该私钥。