2016-05-15 15 views
0

Ich habe einen Integrationstest, der Wiremock als Mock-Server verwendet.SSLHandshakeException keine Cipher Suites in gemeinsam - Linux nur mit Wiremock

Ich habe mein Setup-Server wie folgt:

@ClassRule 
public static WireMockClassRule wireMockRule = new WireMockClassRule(wireMockConfig() 
     .port(9998) 
     .httpsPort(7777) 
     .needClientAuth(true) 
     .trustStorePath(WireMockConfiguration.getTruststorePath()) 
     .trustStorePassword("changeit") 
     .keystorePath(WireMockConfiguration.getTruststorePath()) 
     .keystorePassword("changeit") 
); 

// we only use a single instance of the server across all tests in the class 
@Rule 
public WireMockClassRule instanceRule = wireMockRule; 

wo WireMockConfiguration ist:

public static String getTruststorePath() { 
    return resolveFile("server.truststore"); 
} 

public static String getKeystorePath() { 
    return resolveFile("server.jks"); 
} 

private static String resolveFile(final String file) { 
    final URL resource = WireMockConfiguration.class.getClassLoader().getResource(file); 
    if (resource == null) { 
     throw new IllegalStateException("Could not resolve property"); 
    } 
    return resource.getFile(); 
} 

Dies läuft auf meinem lokalen Windows-Rechner in Ordnung, aber wenn ich es auf dem jenkins Server laufen, die ist auf CentOS erhalte ich die Ausnahme:

javax.net.ssl.SSLHandshakeException: no cipher suites in common 
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) 
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949) 
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302) 
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:292) 
    at sun.security.ssl.ServerHandshaker.chooseCipherSuite(ServerHandshaker.java:1035) 
    at sun.security.ssl.ServerHandshaker.clientHello(ServerHandshaker.java:738) 
    at sun.security.ssl.ServerHandshaker.processMessage(ServerHandshaker.java:221) 
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979) 
    at sun.security.ssl.Handshaker.process_record(Handshaker.java:914) 
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062) 
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375) 
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403) 
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387) 
    at org.mortbay.jetty.security.SslSocketConnector$SslConnection.run(SslSocketConnector.java:708) 
    at com.github.tomakehurst.wiremock.jetty6.DelayableSslSocketConnector$1.run(DelayableSslSocketConnector.java:52) 
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 

Ich generierte den Schlüsselspeicher a nd-Vertrauen wie folgt:

keytool -genkey -alias server-alias -keyalg RSA -keypass changeit -storepass changeit -keystore server.jks 
keytool -genkey -alias client-alias -keyalg RSA -keypass changeit -storepass changeit -keystore client.jks 
keytool -export -alias client-alias -storepass changeit -file client.cer -keystore client.jks 
keytool -import -v -trustcacerts -alias client-alias -file client.cer -keystore server.truststore -keypass changeit -storepass changeit 
+1

Sie können nicht dieselbe Datei als Truststore und Keystore verwenden. Es macht keinen Sinn und es ist eine schlechte Sicherheit. – EJP

Antwort

0

Das Problem war in der Tat in der Regelkonfiguration

.trustStorePath(WireMockConfiguration.getTruststorePath()) 
    .trustStorePassword("changeit") 
    .keystorePath(WireMockConfiguration.getTruststorePath()) 

ich die Trusts sowohl als Trusts und ein Schlüsselspeicher verwendet werden einstellt.