我想创建一个小程序作为输入(1)X509证书(2)签署此证书的相应CA.如果证书完好无损,则应通过验证签名来验证该证书。为此,我认为首先需要提取两件事:(1)签名值(2)剩余的证书字段。以下代码适用于获取公钥但我需要签名值。
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());
我尝试了很多方法来获取签名值,但我失败了。你们能给我至少一个打击吗?谢谢你
答案 0 :(得分:1)
正如评论已经指出的那样,使用getSignature
方法可以获得签名。不过,它是byte[]
。因此,您不应期望任何可用的toString
值。
关于你的原始目标,但是:
通过验证签名验证此证书是否完整。
您不需要手动完成所有这些操作。相反,您应该使用Certificate
方法getPublicKey
和verify
:
boolean check (Certificate testCert, Certificate caCert)
{
try
{
testCert.verify(caCert.getPublicKey());
return true;
}
catch (GeneralSecurityException e)
{
return false;
}
]
根据所使用的算法,您可能需要使用其他验证重载来提供显式提供程序。
对于有疑问的人,Certificate
方法评论:
/**
* 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()