如何创建 SSLEngine 以连接到任何 https 网站,特别是 google 云 运行?
how to create SSLEngine for connecting to any https website specifically google cloud run?
由于来自网站的所有证书都是由 Root CA 等签署的,而我正在编写一个客户端,而不是服务器,我将如何创建一个可以连接到所有证书的 SSLEngine?还是我必须下载证书等才能连接? (我希望 jdk 具有与浏览器相同的关于证书的所有信息,所以这样做应该很容易,尽管我的 google 技能很难找到它,因为大多数链接都是服务器) .
编辑:为了更清楚起见,我有这样的客户端代码,可以使用自签名证书。目前,我通过 chrome 单击锁从我想要的网站下载了证书。然后我将其导入到我的密钥库中,但它仍然无法正常工作...
private SSLEngine createEngine() {
try {
InputStream in = this.getClass().getResourceAsStream("/prodKeyStore.jks");
//char[] passphrase = password.toCharArray();
// First initialize the key and trust material.
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(in, "lP9Ow1uYXZr9zgt6".toCharArray());
SSLContext sslContext = SSLContext.getInstance("TLS");
//****************Client side specific*********************
// TrustManager's decide whether to allow connections.
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(ks);
sslContext.init(null, tmf.getTrustManagers(), null);
//****************Client side specific*********************
SSLEngine engine = sslContext.createSSLEngine();
engine.setUseClientMode(true);
return engine;
} catch(Exception e) {
throw new RuntimeException("Could not create SSLEngine", e);
}
}
接下来,我将尝试弄清楚如何为 ssl 交换打开调试,看看是否有帮助。目前,我不知道为什么这不起作用。
哎呀,调试日志指向这个
javax.net.ssl|DEBUG|21|httpclient2|2020-02-18 08:13:05.095 MST|CertificateMessage.java:358|Consuming server Certificate handshake message (
"Certificates": [
"certificate" : {
"version" : "v3",
"serial number" : "00 90 76 89 18 E9 33 93 A0",
"signature algorithm": "SHA256withRSA",
"issuer" : "CN=invalid2.invalid, OU="No SNI provided; please fix your client."",
"not before" : "2014-12-31 17:00:00.000 MST",
"not after" : "2029-12-31 17:00:00.000 MST",
"subject" : "CN=invalid2.invalid, OU="No SNI provided; please fix your client."",
"subject public key" : "RSA",
"extensions" : [
所以有些东西把事情搞砸了,但还不确定是什么。这是 jdk8。还不确定如何解决这个问题。
谢谢,
院长
原来错了一行,一定是这个
SSLEngine engine = sslContext.createSSLEngine(host, port);
然后一切正常!
由于来自网站的所有证书都是由 Root CA 等签署的,而我正在编写一个客户端,而不是服务器,我将如何创建一个可以连接到所有证书的 SSLEngine?还是我必须下载证书等才能连接? (我希望 jdk 具有与浏览器相同的关于证书的所有信息,所以这样做应该很容易,尽管我的 google 技能很难找到它,因为大多数链接都是服务器) .
编辑:为了更清楚起见,我有这样的客户端代码,可以使用自签名证书。目前,我通过 chrome 单击锁从我想要的网站下载了证书。然后我将其导入到我的密钥库中,但它仍然无法正常工作...
private SSLEngine createEngine() {
try {
InputStream in = this.getClass().getResourceAsStream("/prodKeyStore.jks");
//char[] passphrase = password.toCharArray();
// First initialize the key and trust material.
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(in, "lP9Ow1uYXZr9zgt6".toCharArray());
SSLContext sslContext = SSLContext.getInstance("TLS");
//****************Client side specific*********************
// TrustManager's decide whether to allow connections.
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(ks);
sslContext.init(null, tmf.getTrustManagers(), null);
//****************Client side specific*********************
SSLEngine engine = sslContext.createSSLEngine();
engine.setUseClientMode(true);
return engine;
} catch(Exception e) {
throw new RuntimeException("Could not create SSLEngine", e);
}
}
接下来,我将尝试弄清楚如何为 ssl 交换打开调试,看看是否有帮助。目前,我不知道为什么这不起作用。
哎呀,调试日志指向这个
javax.net.ssl|DEBUG|21|httpclient2|2020-02-18 08:13:05.095 MST|CertificateMessage.java:358|Consuming server Certificate handshake message (
"Certificates": [
"certificate" : {
"version" : "v3",
"serial number" : "00 90 76 89 18 E9 33 93 A0",
"signature algorithm": "SHA256withRSA",
"issuer" : "CN=invalid2.invalid, OU="No SNI provided; please fix your client."",
"not before" : "2014-12-31 17:00:00.000 MST",
"not after" : "2029-12-31 17:00:00.000 MST",
"subject" : "CN=invalid2.invalid, OU="No SNI provided; please fix your client."",
"subject public key" : "RSA",
"extensions" : [
所以有些东西把事情搞砸了,但还不确定是什么。这是 jdk8。还不确定如何解决这个问题。
谢谢, 院长
原来错了一行,一定是这个
SSLEngine engine = sslContext.createSSLEngine(host, port);
然后一切正常!