当前位置: 首页 > 知识库问答 >
问题:

SSLHandshakeException-使用自签名证书从web应用程序调用webservice

冷翼
2023-03-14

我的web应用程序和web服务运行在同一个tomcat容器中。如果我不使用HTTPS,则一切正常。
当我在HTTPS上运行web应用程序和web服务时,当web应用程序试图调用WebServices时,我将获得SSLHandshakeException。

我已经使用以下命令创建了本地自签名证书文件

%JAVA_HOME%\bin\keytool -genkeypair -alias test1 -keyalg RSA -keystore c:/apps/test1.crt

已在C:\apps文件夹中创建了名为test1.crt的证书文件。

现在,我想用下面的命令在Java密钥库中导入这个证书

%JAVA_HOME%\bin\keytool -import -alias test1 -file c:/apps/test1.crt-keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit

当我在Tomcat中使用此证书文件时,使用以下设置

<Connector port="8443"
    maxHttpHeaderSize="8192"
    maxThreads="150"
    minSpareThreads="25"
    maxSpareThreads="75"
    enableLookups="false"
    disableUploadTimeout="true"
    acceptCount="100"
    scheme="https"
    secure="true"
    clientAuth="false"
    sslProtocol="TLS"
    SSLEnabled="true"
    URIEncoding="UTF-8" 
    keystorePass="changeit" 
    keystoreFile="C:/apps/test2.crt" />

我不会在服务器启动时出现任何错误。当我从应用程序调用webservices时,我得到的是SSLHandShakeException

我已经在Java密钥库中添加了一个本地自签名证书,使用下面的命令

%JAVA_HOME%/bin/keytool -genkeypair -alias test2 -keyalg RSA -validity 1000 -keysize 2048 -keystore %JAVA_HOME%/jre/lib/security/cacerts
JAVA_HOME%\bin\keytool -list -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit
%JAVA_HOME%/bin/keytool -export -alias test2 -keystore %JAVA_HOME%/jre/lib/security/cacerts -rfc -file C:/apps/test2.crt

已在C:\apps文件夹中创建了名为test2.crt的证书文件。

当我在Tomcat中使用此证书文件时,使用以下设置

<Connector port="8443"
    maxHttpHeaderSize="8192"
    maxThreads="150"
    minSpareThreads="25"
    maxSpareThreads="75"
    enableLookups="false"
    disableUploadTimeout="true"
    acceptCount="100"
    scheme="https"
    secure="true"
    clientAuth="false"
    sslProtocol="TLS"
    SSLEnabled="true"
    URIEncoding="UTF-8" 
    keystorePass="changeit" 
    keystoreFile="C:/apps/test2.crt" />

我得到以下错误

嵌套异常为:
javax.net.ssl.sslHandShakeException:Sun.Security.Validator.ValidatorException:PKIX路径构建失败:Sun.Security.Provider.CertPath.SunCertPathBuilderException:找不到请求目标的有效证书路径

错误:(org.apache.axis.axisFault)-->[;嵌套异常为:
javax.net.ssl.sslhandshakeException:Sun.Security.Validator.ValidatoreXception:PKIX路径构建失败:Sun.Security.Provider.CertPath.SunCertPathBuilderException:找不到请求目标的有效证书路径]

AxisFault
错误代码:{http://schemas.xmlsoap.org/soap/envelope/}Server.UserException
错误子代码:
错误字符串:javax.net.ssl.sslhandshakeException:Sun.Security.Validator.ValidatoreXception:PKIX路径构建失败:Sun.Security.Provider.CertPath.SunCertPathBuilderException:找不到请求目标的有效证书路径
错误参与者:
错误节点:
错误详细信息:
{

共有1个答案

何建中
2023-03-14

我认为对于Tomcat来说,keystoreFile是“%JAVA_HOME%/jre/lib/security/cacerts”,您不需要指定任何密钥库,因为您在jre公共密钥库中添加了一个keypair,但使用“c:/apps/test2.crt”是完全不正确的。

还要尝试将服务器证书添加到信任存储区文件:

 JAVA_HOME%\bin\keytool -import -v -trustcacerts -alias test2 -file C:/apps/test2.crt -keystore  %JAVA_HOME%/jre/lib/security/cacerts -keypass changeit -storepass changeit
 类似资料:
  • 有一个受证书保护的Web服务。在调用它的客户端代码中,证书的CA必须存在于信任库(JRE_path\lib\security\cacerts)中——如果没有,则客户端会出现PKIX异常。 如果证书过期了会发生什么?客户端代码失败。 但是,可以通过直接将证书添加到信任库中来绕过这一点——信任过期的证书 i、 e.如果信任库中存在证书本身,而不是CA,那么即使证书已过期,一切都可以工作。 在我的场景中

  • 为了解决这个问题,我使用浏览器访问地址,在.cert文件中下载证书,并使用keytool命令导入java cacerts密钥库。在此之后,应用程序可以正常工作。 我的问题是:如果证书是用VeriSign签名的,为什么java不识别证书?默认情况下VeriSign证书没有安装在cacerts密钥库中?也许我不明白SSL是如何工作的。浏览器和java桌面行为有什么不同?我可以用我的浏览器连接到这个UR

  • 我使用pyTelegrambotAPI、cherrypy作为Web服务器、更新方法webhook、自签名Certficate,在六个月的工作后,今晚我的机器人停止响应。 使用命令时: https://api.telegram.org/botMYTOKEN/getwebhookinfo结果是 {"ok": true,"结果":{"url":"https://MY. IP. ADRESS/MYTOKE

  • 我正在将服务迁移到minikube上的kubernetes集群中,这些服务在加载时需要自签名证书,通过NodePort访问服务可以很好地工作,并需要浏览器中的证书(下图),但是通过入口主机访问(域在/etc/hosts中本地修改)为我提供了一个由Acme提供的kubernetes入口控制器伪造的证书,并且跳过了我的自签名证书,没有任何消息。 SSLs应该在应用程序中解密,而不是在入口中解密,并且t

  • 我正在研究SAML2 SSO的Idp端,作为Idp,我们应该向SP发布一个断言,它将由Idp发起。断言中有一个名为x509certificate的字段。我的第一个问题是,该字段是公钥本身还是由CA(证书颁发机构)签名的公钥?我的第二个问题是,如果它是一个由CA签名的公钥,那么自签名是安全的还是由真正的CA签名更好?我的第三个问题是,我们向SP提供Idp元数据更好,还是在任何断言请求中都有证书更安全

  • 我正在为嵌入式Linux设备添加HTTPS支持。我尝试通过以下步骤生成自签名证书: 这是可行的,但我得到一些错误,例如,谷歌Chrome: