Java 从X509证书获取签名值
我想制作一个小程序,它可以作为输入(1)一个X509证书(2)签署该证书的相应CA。它应该通过验证签名来验证此证书是否完整。为此,我认为首先需要提取两件事:(1)签名值(2)剩余的证书字段。下面的代码可以很好地获取公钥,但我需要签名值Java 从X509证书获取签名值,java,ssl,x509certificate,digital-signature,Java,Ssl,X509certificate,Digital Signature,我想制作一个小程序,它可以作为输入(1)一个X509证书(2)签署该证书的相应CA。它应该通过验证签名来验证此证书是否完整。为此,我认为首先需要提取两件事:(1)签名值(2)剩余的证书字段。下面的代码可以很好地获取公钥,但我需要签名值 URL httpslink = new URL("https://mail.yahoo.com"); HttpsURLConnection con = (HttpsURLConnection) httpslink.openConnection(); con.con
URL httpslink = new URL("https://mail.yahoo.com");
HttpsURLConnection con = (HttpsURLConnection) httpslink.openConnection();
con.connect();
Certificate ct[] = con.getServerCertificates();
X509Certificate c = ((X509Certificate) ct[0]);
System.out.println(c.getPublicKey().toString());
我尝试了很多方法来获取签名值,但是失败了。你们能给我至少一次机会吗。谢谢如评论所示,使用
getSignature
方法确实可以获得签名。但它是一个字节[]
。因此,您不应该期望从它的到字符串
值有任何可用的内容
但是,关于你最初的目标:
通过验证签名来验证此证书是否完整
您不需要手动完成所有这些工作。相反,您应该使用证书
方法获取公钥
和验证
:
boolean check (Certificate testCert, Certificate caCert)
{
try
{
testCert.verify(caCert.getPublicKey());
return true;
}
catch (GeneralSecurityException e)
{
return false;
}
]
根据使用的算法,您可能需要使用其他验证重载来提供显式提供程序
对于那些有疑问的人,根据证书
方法注释:
/**
* Verifies that this certificate was signed using the
* private key that corresponds to the specified public key.
*
* @param key the PublicKey used to carry out the verification.
*
* ...
*/
public abstract void verify(PublicKey key)
/**
* Gets the public key from this certificate.
*
* @return the public key.
*/
public abstract PublicKey getPublicKey()
你试过getSignature方法吗?是的,我有。。但它没有显示签名值!它向我显示了这个奇怪的值=>[B@5fa34e31That是对字节[]调用toString()的结果数组。内容仍然是签名。这个问题似乎与主题无关,因为它是基于一个错误。@EJP CA证书及其签名的证书具有相同的公钥?-没有人声称是这样的。请参阅我对答案的补充,
testCert。verify
验证此证书是使用私钥签名的t对应于指定的公钥。@EJP的想法是您通过另一个来源拥有受试者的公钥。-不,想法是您拥有CA证书,并检查与其关联的私钥是否对证书进行了签名以进行测试。这是OP要求的:我想制作一个作为输入的小程序(1)X509证书(2)签署此证书的相应CA。它应该通过验证签名来验证此证书是否完整。好的,谢谢。“完全错误”并没有完全封装所有信息,或者确实是其中的任何信息。“完全错误”并没有完全封装所有信息-诚然,它没有。但我认为一切都有同时,我已经讲清楚了。mkl,谢谢你的回答。这种方法真的节省了我的时间。我正在考虑手动操作。