我们正在使用Maven 2并拥有一个使用SSL客户端身份验证保护的maven存储库管理器.为了让Maven访问存储库,必须将以下系统属性传递给Java:
javax.net.ssl.trustStore = trust.jks
javax.net.ssl.trustStorePassword = <trustPass>
javax.net.ssl.keyStore = keystore.p12
javax.net.ssl.keyStoreType = pkcs12
javax.net.ssl.keyStorePassword =<keyStorePass>
有关详细信息,请参阅此迷你指南.
为了在Maven中设置这些系统属性,我必须使用MAVEN_OPTS环境变量(或直接在命令行上传递它们).无论哪种方式,当Maven实际执行时,所有这些属性都可以被系统上的其他用户看到(通过ps),包括我的密钥库密码.
有没有办法设置这些属性,以便密码不会在命令行上公开?
我在这一行收到错误:
final KeyStore keyStore = KeyStore.getInstance("BKS");
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
java.security.KeyStoreException: BKS not found
at java.security.KeyStore.getInstance(Unknown Source)
at AppListen.<init>(AppListen.java:84)
Run Code Online (Sandbox Code Playgroud)
我将bcprov-jdk16-146.jar添加到"Referenced Libraries"但仍然没有运气.
我的整体程序允许将Android手机用作使用SSL套接字连接的计算机的鼠标和键盘.Android应用程序具有相同的行,没有错误.
我究竟做错了什么?
也许这对大多数人来说都是常识,但不适合我,所以对于像我这样的人来说,这就是我所做的.
我使用BKS的原因是因为这是android允许的唯一格式,但我不知道你只需要在android端,你可以在服务器上使用另一种格式,然后制作密钥的副本并将其转换为BKS在android上使用,省去了BouncyCastle.
我使用了一个JKS密钥用于服务器,而不是将该密钥的副本转换为BKS,以便在android上使用名为portecle的程序.
我正在尝试在两个Java项目之间建立安全连接,但我收到了SSLHandshakeException(没有共同的密码套件).这是在两侧创建套接字的方法:
客户:
private SSLSocket getSocketConnection() throws SSLConnectionException {
try {
/* Load properties */
String keystore = properties.getProperty("controller.keystore");
String passphrase = properties.getProperty("controller.passphrase");
String host = properties.getProperty("controller.host");
int port = Integer.parseInt(properties
.getProperty("controller.port"));
/* Create keystore */
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(new FileInputStream(keystore), passphrase.toCharArray());
/* Get factory for the given keystore */
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(keyStore);
SSLContext ctx = SSLContext.getInstance("SSL");
ctx.init(null, tmf.getTrustManagers(), null);
SSLSocketFactory factory = ctx.getSocketFactory();
return (SSLSocket) factory.createSocket(host, port);
} catch (Exception e) {
throw new SSLConnectionException(
"Problem connecting …Run Code Online (Sandbox Code Playgroud) SSLParameters支持下列特性(如在每个Spring符号): ,cipherSuites,protocols,wantClientAuth,needClientAuth,algorithmConstraints,endpointIdentificationAlgorithm,serverNames,.SNIMatchersuseCipherSuitesOrder
然而,在SSL{Socket, ServerSocket, Engine}.setSSLParameters显而易见的是,只cipherSuites,protocols,wantClientAuth,needClientAuth被使用.其余的SSLParameters是什么?
它们仅用于自定义重量级实现,例如HTTPS客户端,因此JVM根本不使用它们吗?对这些功能的支持是否位于其他地方,如果是这样,在哪里?是useCipherSuitesOrder由JVM,其中支持?它实际上是一个理想的功能吗?
另一个问题就是SSLParameters具有protocols,但它们适用于例如SSLSocket使用已经创建的SSLContext,已经有选择单个协议.在哪种情况下这是有道理的?你能预先申请SSLParameters到SSLContext?你有最广泛的可能SSLContext然后使用约束SSLParameters吗?例如"TLS",使用协议的SSLContext 然后使用协议的SSLParameters {"TLSv1.1", "TLSv1.2"}只有TLS密码套件的子集是否有意义?是"TLS"所有的超集"的TLSv1.X "?
我想从java keytool命令生成一个公钥.cer文件,如下所示:
"keytool -export -alias privatekey -file publickey.cer -keystore privateKeys.store"
并将其导入到一个新的空java密钥库中,如下所示:
"keytool -import -alias publiccert -file publickey.cer -keystore publicCerts.store"
除了我想使用JSSE以编程方式进行导入.
Stack Overlords,发挥你的神奇!谢谢!
关于SSLServerSocket.setWantClientAuth:
如果设置为true如果客户端选择不发送证书,则协商继续.
此外,我注意到如果客户端发送证书但不是信任库的一部分,也会发生这种情况.在这种情况下,协商也不会失败.
那么这个设置的用例是什么?
我正在用Java编写一个简单的HTTPS代理程序用于教育目的.我的程序在一个端口(比如7443)上侦听来自浏览器(比如Firefox)的传入HTTPS请求,解析请求并将其转发到所需的目的地(比如https://www.comodo.com).
Firefox的代理设置设置为使用我的端口进行SSL连接(127.0.0.1 : 7443).
我的代码简短而简单:
static // initializer
{
System.setProperty("javax.net.ssl.keyStore", "MyKeyStore");
System.setProperty("javax.net.ssl.keyStorePassword", "password");
}
SSLServerSocketFactory ssFactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
try {
SSLServerSocket listener = (SSLServerSocket) ssFactory.createServerSocket(port, 64);
listener.setUseClientMode(false);
listener.setWantClientAuth(false);
listener.setNeedClientAuth(false);
SSLSocket connection = (SSLSocket) listener.accept();
browser.startHandshake(); /* <<== Exception throws at this line */
} catch (IOException ex) {
ex.printStackTrace(System.err);
}
Run Code Online (Sandbox Code Playgroud)
但是我抓住了以下异常:
javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
Run Code Online (Sandbox Code Playgroud)
例外情况表明连接可以是纯文本,但只有来自Firefox的HTTPS连接设置为使用此端口.我已经记录了Firefox发送到我的应用程序的内容,这是:
CONNECT www.comodo.com:443 HTTP/1.1
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:20.0) Gecko/20100101 Firefox/20.0
Proxy-Connection: …Run Code Online (Sandbox Code Playgroud) 我正在使用带有HTTPS和有效证书的Jetty,我不确定是否正确,因为密码套件似乎SSL_NULL_WITH_NULL_NULL在服务器日志中.但是,客户端日志看起来不错.
长话故事:我正在附加一个期望Jetty-7.6.10的Java样本和两个用于创建密钥库和信任库的脚本.
JettyHttpsForStackOverflow 一起运行客户端和服务器,或单独运行以解除日志.
该create-chains.sh脚本创建密钥库和信任库.密钥库包含以从临时密钥库生成的根证书颁发机构结束的链.它使用证书颁发机构和中间证书复制真实案例.
该create-single-autosigned.sh脚本也创建密钥库和信任库,但具有自签名证书.
请注意,它SSL_NULL_WITH_NULL_NULL显示为服务器的密码套件,包含两个证书链.
我认为服务器域名没有问题.对于在正确签名的证书中具有与专有名称匹配的域名的计算机上运行的服务器,我遇到了同样的问题.SSLLab确认我服务器上的SSL工作正常(B级),谷歌Chrome连接愉快.
我认为Jetty客户端没有问题.当我使用它时,它只是调用SSLContextFactory我正在设置创建一个SSLSocket.令人惊讶的是,在Jetty客户端日志中,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA似乎是正在使用的密码套件.
SSL_NULL_WITH_NULL_NULL进入Jetty服务器日志是否正常?如果没有,那该怎么办呢?
create-single-autosigned.sh
#!/bin/bash
rm their-keystore.jks 2> /dev/null
rm my-keystore.jks 2> /dev/null
rm my-truststore.jks 2> /dev/null
echo "===================================================="
echo "Creating fake third-party chain ca2 -> ca1 -> ca ..."
echo "===================================================="
keytool -genkeypair -alias ca -dname cn=ca \
-validity 10000 -keyalg RSA -keysize 2048 \
-ext BasicConstraints:critical=ca:true,pathlen:10000 \
-keystore their-keystore.jks -keypass Keypass -storepass Storepass
keytool -genkeypair -alias …Run Code Online (Sandbox Code Playgroud) 我正在使用一个远程服务器,该服务器使用Netty通过Netty SSLHandler库通过TLS握手执行客户端身份验证.这个S/O问题提供了一点:使用双向SSL Handake设置Netty(客户端和服务器证书)
现在,我对这个系统的问题是服务器需要一个TrustManager来初始化SSLContext.根据我的观察,这使用了SunJSSE提供程序.现在,在设置此实现之后,我开始使用RSA客户端证书.现在,我无法使用ECC客户端证书,因为SunJSSE无法识别它们(我认为Java SE 7包含SunEC作为提供商.但SunEC是SunJCE实现而不是SunJSSE实现,因此不能用作TrustManager的提供者).那么,我该怎么办呢.我听说Bouncy Castle可以识别这些证书,但我仍然无法实例化BC作为提供者的TrustManager.
编辑:如果没有办法使用TrustManagers,我是否应该只使用BouncyCastle的API而不是netty的库?这似乎关闭了.这是我显示堆栈跟踪的其他S/O问题:客户端ECC SSL证书包含"未知命名曲线"
我正在尝试在我的项目中启用 SNI 扩展。我jsse.enableSNIExtension通过以下方式设置属性:
1. Writing System.setProperty("jsse.enableSNIExtension", "true");
2. Passing -Djsse.enableSNIExtension=true as VM argument
我在应用程序启动后打印了上述属性的值并且打印的值是 true 但是当 tlsv1.2 尝试与服务器建立握手时,该字段的sun.security.ssl.ClientHandshaker.java private static final boolean enableSNIExtension = Debug.getBooleanProperty("jsse.enableSNIExtension", true);值为 false 最终导致 SNI 标头未包含在扩展中
日志打印如下:
http-nio-9113-exec-2, setSoTimeout(60000) called
http-nio-9113-exec-2, the previous server name in SNI (type=host_name (0), value=xxx.yyy.zzz.com) was replaced with (type=host_name (0), value=xxx.yyy.zzz.com)
Ignoring unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 for TLSv1
.
.
Ignoring unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 for TLSv1.1
%% No cached client session
update handshake state: client_hello[1]
upcoming …Run Code Online (Sandbox Code Playgroud)