我在哪里可以找到Java 6 JSSE/JCE源代码? 并问自己 如何获得具有匹配源的JRE/JDK?但我不知道其中任何一个都没有具体到足以得到我真正追求的答案,所以我将尝试更具体的问题版本.
基本上我试图解决的问题是我希望能够在Windows上使用我的Eclipse调试器并进入Java SSL类(JSSE)来帮助我调试SSL问题以及更好地理解SSL过程.BTW我熟悉(并使用)javax.net.debug = ssl | all系统属性来获取SSL跟踪,虽然这非常有用,但我仍然希望能够逐步完成那些讨厌的代码.
所以我认为我特别需要的是:
我认为最接近的事情(如PW的回答StackOverflow:87106)是在OpenJDK 6 Source Release中找到的OpenJDK源openjdk-6-src-b12-28_aug_2008.tar.gz ,但我不确定是否有匹配的可执行JDK/JRE用于在Windows上运行.
我正在寻找解析每天更新所述文件的XML文件 - 我遇到的唯一问题是他们使用自己的证书(https:// ..)并且我不能使用该特定URL,也不能是否有http:// ...链接可用.
URL url = new URL("https://...");
...
Document document = db.parse(url.openStream());
Run Code Online (Sandbox Code Playgroud)
此代码在运行我的测试时抛出以下异常:
javax.net.ssl.SSLException:java.lang.RuntimeException:意外错误:java.security.InvalidAlgorithmParameterException:trustAnchors参数必须为非空
我已经看到了各种建议,涉及创建各种类来处理这种连接或个人服务器,以及将证书添加到密钥库,然后将该密钥库添加到Java项目,但我一直在无法做到这一点,我正在寻找一种稍微简单的方式让我去在线访问XML.
当我手动创建一个时KeyManager,其中一个步骤是这样的:
KeyManagerFactory.getInstance("SunX509")
Run Code Online (Sandbox Code Playgroud)
这对我需要指定"IbmX509"的IBM jre不起作用.
我的问题:
谢谢,
多龙
在TLS协商期间,客户端将支持的密码列表发送到服务器,服务器选择一个密码,然后开始加密.当我HttpsURLConnection用于通信时,我想更改Android发送到服务器的密码列表.
我知道我可以setSSLSocketFactory在HttpsURLConnection对象上使用它来设置它SSLSocketFactory.当我想要更改由SSLSocket返回的信任管理器等时,这非常有用SSLSocketFactory.
我知道一般这个密码组列表可以使用编辑SSLParameters对象,并将其传递到SSlsocket或SSLEngine使用他们提供的方法的对象.
但SSLSocketFactory似乎没有公开这样的方法!
我找不到一种方法来改变我传递给的创建SSLParameters的返回SSLSocket对象.SSLSocketFactoryHttpsURLConnection
该怎么办?
我想这也与Java有关,不仅仅是Android.也许有一种OO方式来做(例如扩展SSLSocketFactory并提供给它HttpsURLConnection?)
我有一个RSA私钥文件(OCkey.pem).使用java我必须从这个文件中获取私钥.使用下面的openssl命令生成此密钥.注意:我无法在下面的openssl命令中进行任何更改.
openssl> req -newkey rsa:1024 -sha1 -keyout OCkey.pem -out OCreq.pem -subj "/C=country/L=city/O=OC/OU=myLab/CN=OCserverName/" -config req.conf
Run Code Online (Sandbox Code Playgroud)
证书如下所示.
////////////////////////////////////////////////// /////////
bash-3.00 $ less OCkey.pem
----- BEGIN RSA PRIVATE KEY -----
Proc-Type:4,ENCRYPTED
DEK-Info:DES-EDE3-CBC,EA1DBF8D142621BFBYyZuqyqq9 + L0UT8UxwkDHX7P7YxpKugTXE8NCLQWhdS3EksMsv4xNQsZSVrJxE3
Ft9veWuk + PlFVQG2utZlWxTYsUVIJg4KF7EgCbyPbN1cyjsi9FMfmlPXQyCJ72rd
...
...
cBlG80PT4t27h01gcCFRCBGHxiidh5LAATkApZMSfe6BBv4hYjkCmg ==
----- END RSA私钥-----
///////////////////// /////////////////////////////////////////
以下就是我的尝试
byte[] privKeyBytes = new byte[(int)new File("C:/OCkey.pem").length()];
PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(privKeyBytes));
Run Code Online (Sandbox Code Playgroud)
但得到
"java.security.spec.InvalidKeySpecException:java.security.InvalidKeyException:无效的密钥格式"
请帮忙.
我的应用程序有一个个人密钥库,其中包含用于本地网络的可信自签名证书 - 比如说mykeystore.jks.我希望能够使用已在本地配置的自签名证书连接到公共站点(例如google.com)以及本地网络中的站点.
这里的问题是,当我连接到https://google.com时,路径构建失败,因为设置我自己的密钥库会覆盖包含与JRE捆绑在一起的根CA的默认密钥库,报告异常
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Run Code Online (Sandbox Code Playgroud)
但是,如果我将CA证书导入我自己的密钥库(mykeystore.jks),它可以正常工作.有没有办法支持两者?
我有自己的TrustManger用于此目的,
public class CustomX509TrustManager implements X509TrustManager {
X509TrustManager defaultTrustManager;
public MyX509TrustManager(KeyStore keystore) {
TrustManagerFactory trustMgrFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustMgrFactory.init(keystore);
TrustManager trustManagers[] = trustMgrFactory.getTrustManagers();
for (int i = 0; i < trustManagers.length; i++) {
if (trustManagers[i] instanceof X509TrustManager) {
defaultTrustManager = (X509TrustManager) trustManagers[i];
return;
}
}
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
try …Run Code Online (Sandbox Code Playgroud) 有关漏洞,请参阅https://freakattack.com/.
Mozilla wiki有一个包含密码套件推荐的页面:https://wiki.mozilla.org/Security/Server_Side_TLS#Recommended_configurations
我将如何在Java上下文中应用这些或类似的建议(SSLContext,提供程序配置,Tomcat连接器等)?
我有一个在weblogic服务器上运行的Java应用程序.该应用程序有两个不同的模块,使用SSL连接到外部Web服务 - 比如模块A和模块B.
模块A - 基于Axis构建 - 使用信任库A Moudle B - 基于Spring-ws构建 - 使用信任库B.
模块A存在.正在介绍模块B.
我需要能够根据调用的模块在JVM中动态设置信任库.
由于某些限制,我没有选项 - 创建自定义密钥管理器. - 使用一个信任库
我尝试使用System.setProperty im Module B codebase来设置truststore.但是,仅当模块B首先被调用时才有效.例如 - 假设我重新启动JVM然后调用模块A - 它在JVM中设置它自己的信任库然后我调用模块B - 它失败 - 它没有在JVM中设置它自己的信任库,即使我已经使用过System.setProperty方法.
我错过了什么,或者只是System.setProperty不会覆盖现有的设置值.如果是这样,我的选择是什么.
我的任务是实现一个可以在同一端口上处理SSL和非SSL消息的自定义/独立Java Web服务器.
我已经实现了一个NIO服务器,它非常适用于非SSL请求.我对SSL片段感到非常兴奋,并且可以使用一些指导.
这是我到目前为止所做的.
为了区分SSL和非SSL消息,我检查入站请求的第一个字节以查看它是否是SSL/TLS消息.例:
byte a = read(buf);
if (totalBytesRead==1 && (a>19 && a<25)){
parseTLS(buf);
}
Run Code Online (Sandbox Code Playgroud)
在parseTLS()方法中,我实例化一个SSLEngine,如下所示:
java.security.KeyStore ks = java.security.KeyStore.getInstance("JKS");
java.security.KeyStore ts = java.security.KeyStore.getInstance("JKS");
ks.load(new java.io.FileInputStream(keyStoreFile), passphrase);
ts.load(new java.io.FileInputStream(trustStoreFile), passphrase);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, passphrase);
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(ts);
SSLContext sslc = SSLContext.getInstance("TLS");
sslc.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
SSLEngine serverEngine = sslc.createSSLEngine();
serverEngine.setUseClientMode(false);
serverEngine.setEnableSessionCreation(true);
serverEngine.setWantClientAuth(true);
Run Code Online (Sandbox Code Playgroud)
一旦SSLEngine被实例化,我使用unwrap/wrap方法使用直接来自官方JSSE Samples的代码处理入站数据:
log("----");
serverResult = serverEngine.unwrap(inNetData, inAppData);
log("server unwrap: ", serverResult);
runDelegatedTasks(serverResult, serverEngine);
log("----");
serverResult = serverEngine.wrap(outAppData, outNetData);
log("server wrap: ", …Run Code Online (Sandbox Code Playgroud)