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 或其他地方找到很多信息来准确描述这里需要发生的事情。我知道服务器可以处理 RSA
、DSS
或 ECDSA
,所以我将其保留为 ECDSA
,因为那是 DTLS.NET
使用的内容。
我真的需要私钥来创建 CertificateVerify
消息吗?
提前致谢!
握手可以通过其证书对客户端进行身份验证。
虽然它本身的证书是"public",但任何人都可以发送它并且无法进行身份验证。
因此,客户必须证明他也可以访问私钥。这就是使用 "Certificate Verify" 消息的原因。
如果您无法访问证书的 public 密钥的私钥,则无法进行客户端证书握手。
也许密钥库不导出该私钥,而是提供一个 "signing" 函数,其中应用了该私钥。
我需要开始使用 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 或其他地方找到很多信息来准确描述这里需要发生的事情。我知道服务器可以处理 RSA
、DSS
或 ECDSA
,所以我将其保留为 ECDSA
,因为那是 DTLS.NET
使用的内容。
我真的需要私钥来创建 CertificateVerify
消息吗?
提前致谢!
握手可以通过其证书对客户端进行身份验证。 虽然它本身的证书是"public",但任何人都可以发送它并且无法进行身份验证。 因此,客户必须证明他也可以访问私钥。这就是使用 "Certificate Verify" 消息的原因。
如果您无法访问证书的 public 密钥的私钥,则无法进行客户端证书握手。
也许密钥库不导出该私钥,而是提供一个 "signing" 函数,其中应用了该私钥。