我想連接到服務器(不限於HTTPS協議 - 可能是LDAP環比SSL,可能是SMTPS,可能是IMAPS等)可以使用的證書的Java默認情況下不會信任(因爲它們是自簽名的)。
所需的工作流程是嘗試連接,檢索證書信息,將其提供給用戶,如果他接受它,則將其添加到信任庫,以便將來信任它。
我被困在檢索證書。我有代碼(見帖子末尾),我已經從這裏和從有關java SSL問題的答案指向的網站上分離出來。代碼僅創建SSLSocket
,啓動SSL握手,並詢問Certificate[]
的SSL會話。當我使用已經可信的證書連接到服務器時,代碼正常工作。但是,當我使用自簽名的證書連接到服務器,我得到通常:
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
at sun.security.ssl.Alerts.getSSLException(Unknown Source)
at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source)
[etc]
如果我-Djavax.net.debug=all
跑我看到JVM不會檢索自簽名的證書,但將爆破用的連接一個不可信的證書,直到它將返回證書。
似乎是一個雞與雞蛋的問題。它不會讓我看到證書,因爲它們不被信任。但是我需要看到證書能夠將它們添加到信任庫,這樣它們纔會被信任。你如何擺脫這個?
例如,如果我運行程序爲:
java SSLTest www.google.com 443
我得到谷歌正在使用證書的打印輸出。但如果我運行它作爲
java SSLTest my.imap.server 993
我得到上面引用的異常。
代碼:
import java.io.InputStream;
import java.io.OutputStream;
import java.security.cert.*;
import javax.net.SocketFactory;
import javax.net.ssl.*;
public class SSLTest
{
public static void main(String[] args) throws Exception {
if (args.length != 2) {
System.err.println("Usage: SSLTest host port");
return;
}
String host = args[0];
int port = Integer.parseInt(args[1]);
SocketFactory factory = SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
socket.startHandshake();
Certificate[] certs = socket.getSession().getPeerCertificates();
System.out.println("Certs retrieved: " + certs.length);
for (Certificate cert : certs) {
System.out.println("Certificate is: " + cert);
if(cert instanceof X509Certificate) {
try {
((X509Certificate) cert).checkValidity();
System.out.println("Certificate is active for current date");
} catch(CertificateExpiredException cee) {
System.out.println("Certificate is expired");
}
}
}
}
}
謝謝!只是我在尋找的那種東西。並記錄下來,這是一個僅用於控制檯的版本: http://code.google.com/p/java-use-examples/source/browse/trunk/src/com/aw/ad/ UTIL/InstallCert.java – QuantumMechanic