Tag: jsse

java.lang.SecurityException:pipe辖区域策略文件不是由可信签名人签名的

在处理不同的问题(与RMI有关)时,我使用“无限强度”策略文件升级了系统的“安全文件夹”,现在我的应用程序以不同的方式失败。 我得到一个很长的堆栈转储,其中以下位显示相关: Exception in thread "main" java.lang.ExceptionInInitializerError […crop…] Caused by: java.lang.SecurityException: Can not initialize cryptographic mechanism at javax.crypto.JceSecurity.<clinit>(JceSecurity.java:86) … 17 more Caused by: java.lang.SecurityException: The jurisdiction policy files are not signed by a trusted signer! […crop…] 恩,跆拳道? 唯一的改变是我把原始的jar文件放在一边,并在$ JAVA_HOME / lib / security中添加了无限的jar文件。 那个目录现在看起来像这样: $ ls blacklist javaws.policy trusted.libraries cacerts local_policy.jar US_export_policy.jar java.policy local_policy.jar.strong US_export_policy.jar.strong […]

在JVM中注册多个密钥库

我有两个应用程序在同一个Java虚拟机上运行,​​并使用不同的密钥库和信任库。 一个可行的select是使用单个密钥库,并将其他所有的密钥库导入到共享密钥库(例如keytool -import)中,但是如果我可以将单独的密钥库用于在同一个jvm中运行的独立应用程序,那么这真的会有所帮助。 我可以将keystore和truststore设置为jvm参数或系统属性,如下所示: java -Djavax.net.ssl.keyStore=serverKeys -Djavax.net.ssl.keyStorePassword=password -Djavax.net.ssl.trustStore=serverTrust -Djavax.net.ssl.trustStorePassword=password SSLApplication 要么 System.setProperty("javax.net.ssl.keyStore","serverKeys") 但是这种方法的问题在于它指定了要在JVM级别使用的密钥库/信任库,因此在同一个JVM中运行的所有应用程序都获得相同的密钥库/信任库。 我也尝试创build一个自定义的SSLContext并将其设置为默认,但它也为在同一个JVM中运行的所有应用程序设置上下文。 SSLContext context = SSLContext.getInstance("SSL"); context.init(kms, tms, null); SSLContext.setDefault(context); 我希望能够使用不同的密钥库/信任库而不修改个别应用程序代码。 一个可以dynamic注册多个密钥库的解决scheme,除了jvm中的默认密钥库/证书之外,还是很棒的。 解决scheme将以这种方式工作: 当JVM引导时,它从jre / certs文件夹加载所有默认的certs / keystore(当没有指定keystores时默认的java行为)。 当应用程序1加载它注册其密钥库时, 然后当应用程序2加载注册其密钥库… 请让我知道你的想法或解决scheme。 提前致谢!

密钥库types:使用哪一个?

通过查看我的JRE文件java.security ,我发现默认使用的密钥库types被设置为JKS 。 这里有一个可以使用的密钥库types列表。 有推荐的密钥库types吗? 什么是不同的密钥库types的优点/缺点?

为什么Java的SSLSocket发送版本2客户端hello?

SSLSocket.getEnabledProtocols()方法返回以下内容: [SSLv2Hello, SSLv3, TLSv1] 。 实际上,当我调用connect()并打开SSLdebugging时,我看到使用了一个v2客户端hello: main, WRITE: TLSv1 Handshake, length = 81 main, WRITE: SSLv2 client hello message, length = 110 但是我发现两个(不可否认的是旧的)引用说JSSE不支持SSL版本2: 从Java的基础networking : 'SSLv2Hello'是一个伪协议,允许Java用SSLv2'hello消息'发起握手。 这不会导致使用SSLv2协议,这完全不被Java支持。 从JSSE参考指南 : J2SDK 1.4和更高版本中的JSSE实现实现了SSL 3.0和TLS 1.0。 它没有实现SSL 2.0。 现在,我的理解是2.0版客户端hello应该只在客户端支持SSL版本2.0时发送。 从RFC 2246 : 支持SSL版本2.0服务器的TLS 1.0客户端必须发送SSL版本2.0客户端问候消息[SSL2] … 警告:发送版本2.0客户端问候消息的能力将被全部淘汰。 那么为什么Java使用它?

Java客户端证书通过HTTPS / SSL

我正在使用Java 6,并试图使用客户端证书在远程服务器上创buildHttpsURLConnection 。 服务器正在使用自签名根证书,并要求提供受密码保护的客户端证书。 我已经将服务器根证书和客户端证书添加到我在/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/security/cacerts 10.5)中find的默认Java密钥库。 密钥库文件的名称似乎表明客户端证书不应该在那里? 无论如何,将根证书添加到此商店解决了臭名昭着的javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed' problem. 但是,我现在坚持如何使用客户端证书。 我已经尝试了两种方法,并没有让我到任何地方。 首先,首选,尝试: SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault(); URL url = new URL("https://somehost.dk:3049"); HttpsURLConnection conn = (HttpsURLConnection)url.openConnection(); conn.setSSLSocketFactory(sslsocketfactory); InputStream inputstream = conn.getInputStream(); // The last line fails, and gives: // javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 我试过跳过HttpsURLConnection类(不理想,因为我想与服务器通话HTTP),而不是这样做: SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault(); […]

如何在特定的连接上使用不同的证书?

我添加到我们的大型Java应用程序的模块必须与另一家公司的SSL安全网站进行交stream。 问题是该网站使用自签名证书。 我有一份证书副本,用于确认我没有遇到中间人攻击,并且需要将此证书合并到我们的代码中,以便与服务器的连接成功。 这是基本的代码: void sendRequest(String dataPacket) { String urlStr = "https://host.example.com/"; URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setMethod("POST"); conn.setRequestProperty("Content-Length", data.length()); conn.setDoOutput(true); OutputStreamWriter o = new OutputStreamWriter(conn.getOutputStream()); o.write(data); o.flush(); } 如果没有对自签名证书进行任何其他处理,则会在conn.getOutputStream()中死亡,但有以下例外情况: Exception in thread "main" javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target …. […]