从X509证书中获取签名值

时间:2014-02-17 00:04:37

标签: 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.connect();
Certificate ct[] = con.getServerCertificates();

X509Certificate c = ((X509Certificate) ct[0]);
System.out.println(c.getPublicKey().toString());

我尝试了很多方法来获取签名值,但我失败了。你们能给我至少一个打击吗?谢谢你

1 个答案:

答案 0 :(得分:1)

正如评论已经指出的那样,使用getSignature方法可以获得签名。不过,它是byte[]。因此,您不应期望任何可用的toString值。

关于你的原始目标,但是:

  

通过验证签名验证此证书是否完整。

您不需要手动完成所有这些操作。相反,您应该使用Certificate方法getPublicKeyverify

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()