Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.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.security.SignatureException:签名不匹配_Java_Security_Tomcat7_Keytool - Fatal编程技术网

java.security.SignatureException:签名不匹配

java.security.SignatureException:签名不匹配,java,security,tomcat7,keytool,Java,Security,Tomcat7,Keytool,我创建了一个名为cloudsslkeystore.jks的java密钥库 keytool -genkeypair -validity 730 -alias cloudsslkey -keystore cloudsslkeystore.jks -dname "cn=localhost" -keypass password -storepass password 我将其导出为名为cloudcertificate.cer的证书 keytool -export -rfc -keystore cl

我创建了一个名为cloudsslkeystore.jks的java密钥库

 keytool -genkeypair -validity 730 -alias cloudsslkey -keystore cloudsslkeystore.jks -dname "cn=localhost" -keypass password -storepass password
  • 我将其导出为名为cloudcertificate.cer的证书

     keytool -export -rfc -keystore cloudsslkeystore.jks -alias cloudsslkey -file cloudcertificate.cer 
     Enter keystore password:password
     Certificate stored in file <cloudcertificate.cer>
    
    现在,通过修改server.xml,我在另一台机器的tomcat服务器中使用了相同的java密钥库cloudsslkeystore.jks

    <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
                   maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
                   clientAuth="false" sslProtocol="TLS" keystoreFile="c:\keytool\cloudsslkeystore.jks" keystorePass="password" />
    

    去掉这个参数。支持
    javax.net.ssl.keyStore
    javax.net.ssl.keystrepassword
    的机制不支持密钥密码,只支持密钥库密码。

    签名不匹配错误是指客户端不知道服务器身份的症状,ie客户端信任库没有服务器证书

    创建服务器证书并将其添加到密钥库:

    keytool-genkey-noprompt-alias“$alias”-dname”CN=$dname\u CN,OU=$dname\u OU,O=$dname\u O,L=$dname\u L,S=$dname\u S,C=$dname\u C”-keystore“$keystore”-storepass“$storepass”-keypass“$keypass”

    并将其导出到信任库中:

    keytool-export-alias“$alias”-storepass“$storepass”-文件“$alias.cer-keystore”$keystore”

    如果您想要双向SSL,那么必须重复两次,反过来说,他们必须相互了解

    现在棘手的部分是正确构建
    SSLContext
    ,并用它配置客户端和服务器

    在《灰熊》中,我做到了:

    SSLContextConfigurator sslContextConfigurator = new SSLContextConfigurator();
    
    // set up security context
    sslContextConfigurator.setKeyStoreFile(configuration.getKeystore()); // contains the server keypair
    sslContextConfigurator.setKeyStorePass(configuration.getKeystorePassword());
    sslContextConfigurator.setKeyStoreType(configuration.getKeystoreType());
    sslContextConfigurator.setKeyPass(configuration.getKeystoreKeypass());
    sslContextConfigurator.setTrustStoreFile(configuration.getTruststore()); // contains the list of trusted certificates
    sslContextConfigurator.setTrustStorePass(configuration.getTruststorePassword());
    sslContextConfigurator.setTrustStoreType(configuration.getTruststoreType());
    if (!sslContextConfigurator.validateConfiguration(true))
        throw new Exception("Invalid SSL configuration");
    

    对于高级调试,不要忘记
    System.setProperty(“javax.net.debug”,“all”)

    我终于找到了问题: SignatureException不表示客户不知道发卡机构。在这种情况下,将抛出CertPathBuilderException

    SignatureException实际上是由于没有将自签名证书作为受信任的证书导入而导致的,这必须通过附加参数
    -trustcacerts
    来完成


    回答为什么有人要信任自签名证书的问题:服务器用于测试目的,用于通过HTTPS连接到服务器的自动客户端测试。

    签名不匹配
    异常并不意味着,OP说他已经完成了导入步骤。但是没有密码你不能生成密钥库,是吗?至少,我会得到一个输入密码的提示,当我点击return时,我得到的
    密钥库密码太短-必须至少有6个字符
    @tbmsu请阅读我写的内容。我说的是密钥密码,不是密钥库密码。这没用!!我使用了附加参数,但它不起作用。
    Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: Problem writing SAAJ model to stream: sun.security.validator.ValidatorException: PKIX
     path validation failed: java.security.cert.CertPathValidatorException: signature check failed
            at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:159)
            at com.sun.proxy.$Proxy39.getAllRecommendations(Unknown Source)
            at client.WSClient.main(WSClient.java:73)
    Caused by: com.ctc.wstx.exc.WstxIOException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValida
    torException: signature check failed
            at com.ctc.wstx.sw.BaseStreamWriter.writeCharacters(BaseStreamWriter.java:458)
            at org.apache.cxf.staxutils.StaxUtils.copy(StaxUtils.java:749)
            at org.apache.cxf.staxutils.StaxUtils.copy(StaxUtils.java:696)
            at org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor$SAAJOutEndingInterceptor.handleMessage(SAAJOutInterceptor.java:214)
            at org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor$SAAJOutEndingInterceptor.handleMessage(SAAJOutInterceptor.java:174)
            at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
            at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:514)
            at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:423)
            at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:326)
            at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:279)
            at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
            at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:137)
            ... 2 more
    Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathVal
    idatorException: signature check failed
            at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
            at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1884)
            at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:276)
            at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:270)
            at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1341)
            at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:153)
            at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868)
            at sun.security.ssl.Handshaker.process_record(Handshaker.java:804)
            at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016)
            at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
            at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)
            at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)
            at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563)
            at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
            at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1091)
            at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250)
            at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.setupWrappedStream(URLConnectionHTTPConduit.java:17
    4)
            at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleHeadersTrustCaching(HTTPConduit.java:1302)
            at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.onFirstWrite(HTTPConduit.java:1258)
            at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.onFirstWrite(URLConnectionHTTPConduit.java:201)
            at org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.java:47)
            at org.apache.cxf.io.AbstractThresholdOutputStream.unBuffer(AbstractThresholdOutputStream.java:89)
            at org.apache.cxf.io.AbstractThresholdOutputStream.write(AbstractThresholdOutputStream.java:63)
            at org.apache.cxf.io.CacheAndWriteOutputStream.write(CacheAndWriteOutputStream.java:80)
            at org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.java:51)
            at com.ctc.wstx.io.UTF8Writer.write(UTF8Writer.java:143)
            at com.ctc.wstx.sw.BufferingXmlWriter.writeRaw(BufferingXmlWriter.java:285)
            at com.ctc.wstx.sw.BufferingXmlWriter.writeCharacters(BufferingXmlWriter.java:603)
            at com.ctc.wstx.sw.BaseStreamWriter.writeCharacters(BaseStreamWriter.java:456)
            ... 13 more
    Caused by: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: signature check fail
    ed
            at sun.security.validator.PKIXValidator.doValidate(PKIXValidator.java:350)
            at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:260)
            at sun.security.validator.Validator.validate(Validator.java:260)
            at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:326)
            at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:231)
            at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:126)
            at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1323)
            ... 37 more
    Caused by: java.security.cert.CertPathValidatorException: signature check failed
            at sun.security.provider.certpath.PKIXMasterCertPathValidator.validate(PKIXMasterCertPathValidator.java:159)
            at sun.security.provider.certpath.PKIXCertPathValidator.doValidate(PKIXCertPathValidator.java:351)
            at sun.security.provider.certpath.PKIXCertPathValidator.engineValidate(PKIXCertPathValidator.java:191)
            at java.security.cert.CertPathValidator.validate(CertPathValidator.java:279)
            at sun.security.validator.PKIXValidator.doValidate(PKIXValidator.java:345)
            ... 43 more
    Caused by: java.security.SignatureException: Signature does not match.
            at sun.security.x509.X509CertImpl.verify(X509CertImpl.java:451)
            at sun.security.provider.certpath.BasicChecker.verifySignature(BasicChecker.java:160)
            at sun.security.provider.certpath.BasicChecker.check(BasicChecker.java:139)
            at sun.security.provider.certpath.PKIXMasterCertPathValidator.validate(PKIXMasterCertPathValidator.java:133)
            ... 47 more
    
    -keypass password 
    
    SSLContextConfigurator sslContextConfigurator = new SSLContextConfigurator();
    
    // set up security context
    sslContextConfigurator.setKeyStoreFile(configuration.getKeystore()); // contains the server keypair
    sslContextConfigurator.setKeyStorePass(configuration.getKeystorePassword());
    sslContextConfigurator.setKeyStoreType(configuration.getKeystoreType());
    sslContextConfigurator.setKeyPass(configuration.getKeystoreKeypass());
    sslContextConfigurator.setTrustStoreFile(configuration.getTruststore()); // contains the list of trusted certificates
    sslContextConfigurator.setTrustStorePass(configuration.getTruststorePassword());
    sslContextConfigurator.setTrustStoreType(configuration.getTruststoreType());
    if (!sslContextConfigurator.validateConfiguration(true))
        throw new Exception("Invalid SSL configuration");