我希望验证X509证书以确保它是由与公钥对应的私钥签名的:
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
private async void Button_Click(object sender, RoutedEventArgs e)
{
String MyGetRequest = await GetRequest();
ResultTextBlock.Text = MyGetRequest.ToString() + " - ";
}
public static async Task<String> GetRequest()
{
Uri geturi = new Uri("url"); //replace your url
System.Net.Http.HttpClient client = new System.Net.Http.HttpClient();
System.Net.Http.HttpResponseMessage responseGet = await client.GetAsync(geturi);
string response = await responseGet.Content.ReadAsStringAsync();
return response;
}
在我看来,var publicKey *rsa.PublicKey = getPublicKey()
var certificate *x509.Certificate = getCertificate()
certificate.CheckSignature(...)
方法是正确的方法,但我无法弄清楚它需要的参数,并希望得到社区的帮助。
顺便说一句,我能够在java中做同样的事情(处理两个相邻的项目)。它看起来像这样:
certificate.CheckSignature
我很欣赏这个领域的任何暗示! P上。
答案 0 :(得分:1)
如果我理解你想要做什么,那么回答很简单。
您的证书包含公钥。因此,您只需要将公钥与证书中的公钥进行比较。代码如下:
if certificate.PublicKey.(*rsa.PublicKey).N.Cmp(publicKey.(*rsa.PublicKey).N) == 0 && publicKey.(*rsa.PublicKey).E == certificate.PublicKey.(*rsa.PublicKey).E {
println("Same key")
} else {
println("Different keys")
}
<强>更新强>
刚检查过OpenJDK implementation of .verify
method。看起来可能存在证书不包含公钥并且您确实需要验证签名的情况。这种情况的Go代码如下所示:
h := sha256.New()
h.Write(certificate.RawTBSCertificate)
hash_data := h.Sum(nil)
err = rsa.VerifyPKCS1v15(publicKey.(*rsa.PublicKey), crypto.SHA256, hash_data, certificate.Signature)
if err != nil {
println("Signature does not match")
}
答案 1 :(得分:1)
感谢罗曼,我设法让它像这样工作:
hash := sha1.New()
hash.Write(certificate.RawTBSCertificate)
hashData := hash.Sum(nil)
rsa.VerifyPKCS1v15(dsPublicKey, crypto.SHA1, hashData, certificate.Signature)
所以,这基本上是你推荐的,但是使用了sha1哈希 - 这就是我在本地生成的证书所获得的。我还设法通过临时交换证书的公钥以及我想要验证的密钥来使其正常工作:
certificate.PublicKey = certificateAuthorityPublicKey
certificate.CheckSignature(x509.SHA1WithRSA, certificate.RawTBSCertificate, certificate.Signature)
第二种方法看起来很糟糕,但它们都按预期工作......
想知道在运行时是否可以确定它是SHA1还是SHA256?