环境: Java版1.8.0_121
状况:
使用RSA 1024创建证书。 已启用SSL,我的网站可通过https。
获取TASK: 我想禁用RSA 1024的站点可用性。
ACTION:
我修改了jdk.certpath.disabledAlgorithms=RSA keySize < 2048
然后从名为网站的浏览器 - &gt;可用且RSA未被禁用。
我修改了jdk.certpath.disabledAlgorithms=RSA
然后从名为网站的浏览器 - &gt;不可用且RSA已禁用(收到错误消息,请参阅结果)。
RESULT
javax.net.ssl.SSLHandshakeException: no cipher suites in common
at sun.security.ssl.Handshaker.checkThrown(Handshaker.java:1478)
at sun.security.ssl.SSLEngineImpl.checkTaskThrown(SSLEngineImpl.java:535)
at sun.security.ssl.SSLEngineImpl.writeAppRecord(SSLEngineImpl.java:1214)
at sun.security.ssl.SSLEngineImpl.wrap(SSLEngineImpl.java:1186)
at javax.net.ssl.SSLEngine.wrap(SSLEngine.java:469)
at org.apache.tomcat.util.net.SecureNioChannel.handshakeWrap(SecureNioChannel.java:424)
at org.apache.tomcat.util.net.SecureNioChannel.handshake(SecureNioChannel.java:205)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1411)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
问题:
如何通过keySize约束禁用RSA?
答案 0 :(得分:2)
修改:抱歉,我不知何故认为这是针对客户端和(因此)证书验证;回头看你并没有这么说,但只有来自Tomcat(服务器!)的痕迹才让我意识到这一点。进一步正确调查后:
在您编辑的旁边的注释中解释并且已经在所有Oracle j8 +版本(以及一些j7)的默认值中的语法是RSA keySize < 2048
或RSA keySize <= 1024
- 但是keySize部分仅起作用对于证书(路径)验证,它适用于实际的特定证书,通常在SSL / TLS客户端上完成,但不在SSL / TLS服务器上完成。
JSSE使用jdk.tls.disabledAlgorithms
和jdk.certpath.disabledAlgorithms
来过滤所使用的密码套件列表(现在正在查看它,我不知道为什么;一个不适合进行证书验证的算法并不是&#39 ; t自动使其不适合TLS)但密码过滤仅适用于整个算法的条目而不适用于特定keySize的条目,因为在密码过滤完成时keySize不可靠。 (客户端根本不知道;服务器可以有多个密钥和链,并且选择可以使用ClientHello中的SNI扩展。选择也可以基于客户端的支持_曲线,OpenSSL可以,但是AFAICS JSSE并不是,至少在默认的X509KeyManagerImpl
中。)
因此,尽管设置jdk.certpath.disabledAlgorithms=alg
确实会禁用所有{alg}密码套件,但设置alg keySize...
却没有。我不认为你可以自动检查这个,你只需要配置一个太弱的密钥(及其证书/链)。
(同时清理评论。)