Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java代码签名证书与SSL证书相同吗?_Java_Ssl_Certificate_Code Signing - Fatal编程技术网

Java代码签名证书与SSL证书相同吗?

Java代码签名证书与SSL证书相同吗?,java,ssl,certificate,code-signing,Java,Ssl,Certificate,Code Signing,我正在四处寻找Java证书,这样我的Java小程序就不会发出如此可怕的安全警告。然而,我发现所有提供服务的地方收费(在我看来)太高了,比如每年超过200美元。在进行研究时,代码签名证书似乎与证书几乎完全相同 我的主要问题是:是否可以购买SSL证书,但用它来签署Java小程序?简短回答:不,它们是不同的 详细回答:这是同一种证书,它使用相同的加密软件,但是证书有标志指示它被允许用于什么。代码签名和web服务器是不同的用途 在Firefox(等)中导入新CA证书时,我可以选择使用我信任的证书: 签

我正在四处寻找Java证书,这样我的Java小程序就不会发出如此可怕的安全警告。然而,我发现所有提供服务的地方收费(在我看来)太高了,比如每年超过200美元。在进行研究时,代码签名证书似乎与证书几乎完全相同


我的主要问题是:是否可以购买SSL证书,但用它来签署Java小程序?

简短回答:不,它们是不同的


详细回答:这是同一种证书,它使用相同的加密软件,但是证书有标志指示它被允许用于什么。代码签名和web服务器是不同的用途

在Firefox(等)中导入新CA证书时,我可以选择使用我信任的证书:

  • 签名服务器
  • 符号代码(与小程序类似)
  • 签署电子邮件证书
所以对我来说,答案是:是的,它们是一样的。此外,为什么不使用(Unix上的man openssl、man x509、man req等)生成您自己的呢?您是想让警告安静下来,还是想让您从未见过的其他人相信您的代码?如果您不需要其他用户将信任链接到与浏览器、操作系统等捆绑在一起的锚CA,那么使用OpenSSL生成您自己的锚CA


如果您选择后者,请询问“如何使用OpenSSL生成自己的证书?”Thawte提供代码签名证书。我想其他认证机构也会提供这种服务。您还可以使用创建自签名证书。

X.509证书可能包括(KU)和(EKU)。创建一个没有任何密钥使用标志的证书,这可以正常工作(如果您可以获得一个受信任的CA对其进行签名)

但越来越多的CA使用这些密钥使用字段颁发证书。如果存在,这些字段将限制证书的使用。java插件检查以下字段是否存在:

/**
*检查此证书是否可用于代码签名。
*@CertificateException,如果不是。
*/
私有无效校验码签名(X509证书证书)
抛出证书异常{
Set exts=getCriticalExtensions(证书);
if(checkKeyUsage(cert,KU_签名)=false){
抛出新的验证器异常
(“密钥使用不允许数字签名”,
ValidatorException.T_EE_扩展,证书);
}
if(checkEKU(证书、exts、OID_EKU_代码_签名)=false){
抛出新的验证器异常
(“扩展密钥使用不允许用于代码签名”,
ValidatorException.T_EE_扩展,证书);
}
if(!SimpleValidator.getNetscapeCertTypeBit(证书,NSCT\U SSL\U客户端)){
抛出新的验证器异常
(“Netscape证书类型不允许用于SSL客户端”,
ValidatorException.T_EE_扩展,证书);
}
//不检查Netscape证书类型以进行JCE代码签名检查
//(某些证书的扩展名不正确)
if(variant.equals(Validator.VAR_JCE_SIGNING)==false){
if(!SimpleValidator.getNetscapeCertTypeBit(证书、NSCT\u代码\u签名)){
抛出新的验证器异常
(“Netscape证书类型不允许用于代码签名”,
ValidatorException.T_EE_扩展,证书);
}
exts.remove(SimpleValidator.OID\u NETSCAPE\u CERT\u TYPE);
}
//删除我们检查过的扩展
exts.remove(SimpleValidator.OID\u KEY\u用法);
exts.remove(SimpleValidator.OID\u扩展键\u用法);
checkRemainingExtensions(exts);
}
检查方法如下所示:

/**
 * Utility method checking if the extended key usage extension in
 * certificate cert allows use for expectedEKU.
 */
private boolean checkEKU(X509Certificate cert, Set<String> exts,
        String expectedEKU) throws CertificateException {
    List<String> eku = cert.getExtendedKeyUsage();
    if (eku == null) {
        return true;
    }
    return eku.contains(expectedEKU) || eku.contains(OID_EKU_ANY_USAGE);
}
/**
*实用工具方法检查扩展密钥使用扩展是否在
*证书证书允许使用expectedEKU。
*/
专用布尔校验单元(X509Certificate cert,Set exts,
字符串expectedEKU)抛出CertificateException{
List eku=cert.getExtendedKeyUsage();
如果(eku==null){
返回true;
}
返回eku.contains(expectedEKU)| | eku.contains(OID_eku_ANY_用法);
}
因此,如果没有指定KU或EKU,KU或EKU检查器将愉快地返回true

但是

  • 如果指定了KU,则数字签名KU应该是其中之一
  • 如果指定了任何EKU,还应指定EKU代码签名(由oid 1.3.6.1.5.5.7.3.3标识)或EKU任何用途(由oid 2.5.29.37.0标识)
最后,
checkRemainingExtensions
方法检查剩余的关键EKU。唯一允许出现的其他关键EKU是

  • 基本约束条件(oid“2.5.29.19”)和
  • 受试者alt名称(oid 2.5.29.17)

如果发现任何其他关键EKU,则返回false。

是的,我希望其他人信任小程序,因此自签名在这种情况下并没有真正的帮助。是的,我知道他们提供代码签名证书,但它们的成本太高了——一年300美元!我希望我可以使用一个更便宜的SSL证书,你可以用30美元的价格买到。第一个链接现在断了(404)。该死……我打赌他们把这些标志放在那里只是为了细分市场,并在一定程度上收取更多的费用。不过,它确实有助于提高安全性。
/**
 * Utility method checking if the extended key usage extension in
 * certificate cert allows use for expectedEKU.
 */
private boolean checkEKU(X509Certificate cert, Set<String> exts,
        String expectedEKU) throws CertificateException {
    List<String> eku = cert.getExtendedKeyUsage();
    if (eku == null) {
        return true;
    }
    return eku.contains(expectedEKU) || eku.contains(OID_EKU_ANY_USAGE);
}