我是第一个进行自动化测试的人 . 因此,我有一项任务是为API测试创建自动脚本 . 我需要使用自签名的证书创建https请求 . 这个证书给了我们管理员p12扩展名和密码文件 . 我将此证书导出到.cer extenssion . 比我创建信任库并将此证书导入此商店 .
C:\Program Files (x86)\Java\jdk1.8.0_25\jre\bin>keytool -import -keystore clienttrust.jks -file marta.cer -storepass storepass
我在我的项目附近找到了marta.cer和clienttrust.jks . 我在Java上的IntelliJ IDEA 13.1.1中编写了我的代码 .
这是代码:
public void testSimpleHttpsClient() throws CertificateException, InterruptedException, UnrecoverableKeyException, NoSuchAlgorithmException,
IOException, KeyManagementException, KeyStoreException {
URL url = new URL("https://intstg1-kaakioskpublicapi.ptstaging.ptec/TLE/36171/player/info");
HttpsURLConnection con = (HttpsURLConnection)url.openConnection();
con.setRequestMethod( "GET" );
SSLContext sslContext = SSLContext.getInstance("TLS");
char[] passphrase = "storepass".toCharArray();
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(this.getClass().getResourceAsStream("clienttrust.jks"), passphrase);
System.out.println(ks);
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(ks);
System.out.println(tmf.toString());
HostnameVerifier hostnameVerifier = new HostnameVerifier() {
public boolean verify(String s, SSLSession sslSession) {
return s.equals(sslSession.getPeerHost());
}
};
con.setHostnameVerifier(hostnameVerifier);
sslContext.init(null, tmf.getTrustManagers(), null);
con.setSSLSocketFactory(sslContext.getSocketFactory());
int responseCode = con.getResponseCode();
InputStream inputStream;
if (responseCode == HttpURLConnection.HTTP_OK) {
inputStream = con.getInputStream();
} else {
inputStream = con.getErrorStream();
}
// Process the response
BufferedReader reader;
String line = null;
reader = new BufferedReader( new InputStreamReader( inputStream ) );
while( ( line = reader.readLine() ) != null )
{
System.out.println( line );
}
inputStream.close();
}
因此,在执行此代码后,我得到下一个异常:
线程“main”中的异常javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:在sun.security.ssl的sun.security.ssl.Alerts.getSSLException(Alerts.java:192)找不到可信证书 . SSLSocketImpl.fatal(SSLSocketImpl.java:1917)at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:301)at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:295)at sun.security.ssl .ClientHandshaker.serverCertificate(ClientHandshaker.java:1471)at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:212)at sun.security.ssl.Handshaker.processLoop(Handshaker.java:936)at sun.security . ssl.Handshaker.process_record(Handshaker.java:871)at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1043)at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1343)at sun.security .sl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1371)at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1355)at sun.net.www.protocol.h ttps.HttpsClient.afterConnect(HttpsClient.java:563)at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection . java:1511)at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1439)at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)at sun.net.www.protocol.https .httpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:338)at httpConnection.Connection.testSimpleHttpsClient(Connection.java:179)at httpConnection.Connection.main(Connection.java:22)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:483)at com.intellij .rt.execution.application.AppMain.main(AppMai n.java:120)引起:sun.security.validator.ValidatorException:sun.security.validator.SimpleValidator.buildTrustedChain(SimpleValidator.java:384)sun.security.validator.SimpleValidator.engineValidate(SimpleValidator)找不到可信证书.java:133)在sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)的sun.security.validator.Validator.validate(Validator.java:260)sun.security.ssl.X509TrustManagerImpl.checkTrusted( X509TrustManagerImpl.java:229)sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1453)... 20更多
伙计们,请向我解释如何解决这个问题 .
1 回答
将服务器证书导入为受信任
keytool -import -trustcacerts -alias somealias -keystore clienttrust.jks -file marta.cer