Java 从X509证书获取签名值

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

我想制作一个小程序,它可以作为输入(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());

我尝试了很多方法来获取签名值,但是失败了。你们能给我至少一次机会吗。谢谢

如评论所示,使用
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,谢谢你的回答。这种方法真的节省了我的时间。我正在考虑手动操作。