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 打开https URL时出错:未设置keyCertSign位_Java_Ssl_Groovy - Fatal编程技术网

Java 打开https URL时出错:未设置keyCertSign位

Java 打开https URL时出错:未设置keyCertSign位,java,ssl,groovy,Java,Ssl,Groovy,我正在使用以下代码调用远程https URL: def inputStream = new URL("https://somewebsite.com").openStream() 这在我的本地计算机上非常有效,但当我部署到服务器时,会出现以下异常: java.security.cert.CertPathValidatorException: CA key usage check failed: keyCertSign bit is not set 这个错误的原因是什么?是什么原因导致它

我正在使用以下代码调用远程https URL:

   def inputStream = new URL("https://somewebsite.com").openStream()
这在我的本地计算机上非常有效,但当我部署到服务器时,会出现以下异常:

java.security.cert.CertPathValidatorException: CA key usage check failed: keyCertSign bit is not set
这个错误的原因是什么?是什么原因导致它在一台机器上工作而不是在另一台机器上工作


更新


我正在生产中运行Ubuntu服务器,并在Mac上本地开发。我试图访问的站点(我们称之为peopleware.com)具有以下证书信息:

  • AddTrust外部CA根
  • UTN用户优先硬件
  • peopleware.com

  • 我已尝试从浏览器中保存.cer文件,并将其安装到/etc/ssl/certs/java/castore的密钥库中。我假设您正在谈论来自UTN USERFirst硬件的此证书:

    -----BEGIN CERTIFICATE----- 
    MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB
    lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
    Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
    dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt
    SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG
    A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe
    MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v
    d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh
    cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn
    0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ
    M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a
    MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd
    oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI
    DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy
    oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD
    VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0
    dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy
    bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF
    BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
    //bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli
    CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE
    CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t
    3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS
    KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== 
    -----END CERTIFICATE-----
    
    在人类可读的版本中:

    Version: 3 (0x2)
    Serial Number:
        44:be:0c:8b:50:00:24:b4:11:d3:36:2a:fe:65:0a:fd
    Signature Algorithm: sha1WithRSAEncryption
    Issuer: C=US, ST=UT, L=Salt Lake City, O=The USERTRUST Network, OU=http://www.usertrust.com, CN=UTN-USERFirst-Hardware
    Validity
        Not Before: Jul  9 18:10:42 1999 GMT
        Not After : Jul  9 18:19:22 2019 GMT
    Subject: C=US, ST=UT, L=Salt Lake City, O=The USERTRUST Network, OU=http://www.usertrust.com, CN=UTN-USERFirst-Hardware
    Subject Public Key Info:
        [...]
    X509v3 extensions:
        X509v3 Key Usage: 
            Digital Signature, Non Repudiation, Certificate Sign, CRL Sign
        X509v3 Basic Constraints: critical
            CA:TRUE
        X509v3 Subject Key Identifier: 
            A1:72:5F:26:1B:28:98:43:95:5D:07:37:D5:85:96:9D:4B:D2:C3:45
        X509v3 CRL Distribution Points: 
    
            Full Name:
              URI:http://crl.usertrust.com/UTN-USERFirst-Hardware.crl
    
        X509v3 Extended Key Usage: 
            TLS Web Server Authentication, IPSec End System, IPSec Tunnel, IPSec User
    
    本质上,我们这里有一个CA证书,既有
    X509v3密钥用法
    又有
    X509v3扩展密钥用法

    然而:

    通常,此扩展仅出现在结束实体中 证书

    对于CA证书来说,这不是一个很好的开始,但稍后,同一节还说:

    如果证书同时包含密钥使用扩展名和扩展名 密钥使用扩展,则必须处理这两个扩展 独立使用,且证书只能用于特定目的 与两个扩展一致。如果没有一致的目的 对于这两个扩展,则证书不得用于任何 目的

    此证书中唯一在此RFC中的扩展密钥使用扩展是TLS Web服务器身份验证:

    当然,这与根据RFC 3280(和RFC 5280)的keyCertSign不一致。(我还怀疑任何IPSec扩展是否与
    keyCertSign
    兼容)。这使得此证书无法颁发证书(对于CA证书不是很有用)

    我会联系使用此证书的网站,要求他们联系他们的CA(UTN USERFirst Hardware,显然是Comodo),并要求他们修复此问题。我必须说,从那些靠这些RFC赚钱的人那里来,看起来不太好

    当然,这可能需要一段时间,并不能解决您眼前的问题

    我想我在其他中间CA证书中见过这个主题DN(UTN USERFirst Hardware),所以上面的可能不是您正在使用的

    您可能能够做的是(假设您能够手动验证服务器证书本身,尽管存在这些问题),为该连接使用
    SSLContext
    TrustManager
    ,具体限于使用该证书。这可能会阻止证书路径算法尝试查找颁发者证书并陷入此问题

    编辑:

    下面是有关此解决方法的更多详细信息(这将仍然保持您的连接安全)

    • 使用Firefox连接到此网站
    • 单击蓝色/绿色栏并选择“更多信息…”
    • 安全->查看证书->详细信息
    • 从顶部列表中选择服务器证书,然后选择“导出…”
    • 和PEM文件里的一样
    使用
    keytool
    创建新的密钥库(选择信任该证书并选择合理的密码):

    然后,使用以下Java代码,将其移植到Groovy应该不会太难:

    TrustManagerFactory tmf = TrustManagerFactory
        .getInstance(TrustManagerFactory.getDefaultAlgorithm());
    KeyStore ks = KeyStore.getInstance("JKS");
    FileInputStream fis = new FileInputStream("/.../example.jks");
    ks.load(fis, null);
    // or ks.load(fis, "thepassword".toCharArray());
    fis.close();
    
    tmf.init(ks);
    
    SSLContext sslContext = SSLContext.getInstance("TLS");
    sslContext.init(null, tmf.getTrustManagers(), null);
    
    URL url = new URL("https://somewebsite.com");
    HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
    conn.setSSLSocketFactory(sslContext.getSocketFactory());
    
    InputStream is = conn.getInputStream();
    

    很可能您的服务器没有安装正确的根证书,因此无法验证站点提供的SSL证书是否有效。谢谢-我购买了SSL证书并将其安装在此服务器上。这可能与此有关吗?或者这是无关的?这取决于,是从服务器连接到另一台机器时出现此错误,还是从另一台机器连接到服务器时出现此错误?错误是从这台机器连接到第三方服务器时出现的。到我自己的服务器的https连接工作正常。那么它不应该与服务器上的证书有任何关系。服务器上的Java版本可能较旧,或者在另一个具有较旧根证书的操作系统上。如果您能够确定所需的证书(使用浏览器访问站点并查看安全详细信息,通常会处理这些问题),那么您应该能够从计算机的Java控制面板导出证书并将其导入服务器。
    keytool -importcert -keystore example.jks -file example.pem
    
    TrustManagerFactory tmf = TrustManagerFactory
        .getInstance(TrustManagerFactory.getDefaultAlgorithm());
    KeyStore ks = KeyStore.getInstance("JKS");
    FileInputStream fis = new FileInputStream("/.../example.jks");
    ks.load(fis, null);
    // or ks.load(fis, "thepassword".toCharArray());
    fis.close();
    
    tmf.init(ks);
    
    SSLContext sslContext = SSLContext.getInstance("TLS");
    sslContext.init(null, tmf.getTrustManagers(), null);
    
    URL url = new URL("https://somewebsite.com");
    HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
    conn.setSSLSocketFactory(sslContext.getSocketFactory());
    
    InputStream is = conn.getInputStream();