javax.net.ssl.SSLHandshakeException
自制ssl证书,报错:javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: Certificate signature algorithm disabled
原因是jre里信任的CA不包含自制CA,可以用keytools加入自制ca:
1 | keytool -import -noprompt -trustcacerts -alias YOURALIS -file 自制CA的PEM文件 -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit |
changeit 是默认密码
查看所有信任的CA可以用命令:
1 | keytool -list -keystore %JAVA_HOME%/jre/lib/security/cacerts |
java.security.cert.CertPathValidatorException
在高版本jdk,访问某些老网站时,可能出错:java.security.cert.CertPathValidatorException: Usage constraint TLSServer check failed: SHA1 used with certificate: CN=GeoTrust Global CA, O=GeoTrust Inc., C=US. Usage was tls server
这是由于网站使用了SHA1的签名证书,而此版本JDK已经把SHA1证书列为禁止导致,如果要打开支持,可以编辑 %JAVA_HOME%/jre/lib/security/java.security文件,找到jdk.certpath.disabledAlgorithms=这行(后面值内容可能不同):
jdk.certpath.disabledAlgorithms=MD2, MD5, SHA1 jdkCA & usage TLSServer, \
RSA keySize < 1024, DSA keySize < 1024, EC keySize < 224
把里面SHA1部分删除掉改成
jdk.certpath.disabledAlgorithms=MD2, MD5, RSA keySize < 1024, \
DSA keySize < 1024, EC keySize < 224
另外jdk.tls.disabledAlgorithms 也是类似禁止某些tls算法的。