1

I にはにする必要があります。安心して使用できる古いバージョン(1.8.1)で動作します。テスト用に使用しているサーバーには自己署名入りのSSL証明書があるので、post()またはget()のリクエストはすべて安心保証から失敗します。安心の古いバージョンで自己署名SSL証明書を許可する方法

私はバージョン2.2.0以降、これはかなり簡単にssl接続を設定して、relaxedHTTPSValidationを使用することを知っています。

given().relaxedHTTPSValidation().when().get("https://some_server.com") 

私はまたSSL configに対処する方法を、残り-保証ウィキに発見しました。

私の質問は、安心できる古いバージョン(1.8.1)でも可能です。

スローされる例外はSSLHandshakeExceptionです。

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(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:296) 
     at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1509) 
     at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216) 
     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.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:543) 
     at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:409) 
     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:177) 
     at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:304) 
     at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:611) 
     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:446) 
     at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:882) 
     at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) 
     at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55) 
     at org.apache.http.client.HttpClient$execute.call(Unknown Source) 
     at com.jayway.restassured.internal.RequestSpecificationImpl$RestAssuredHttpBuilder.doRequest(RequestSpecificationImpl.groovy:1377) 
     at com.jayway.restassured.internal.http.HTTPBuilder.post(HTTPBuilder.java:341) 
     at com.jayway.restassured.internal.http.HTTPBuilder$post.call(Unknown Source) 
     at com.jayway.restassured.internal.RequestSpecificationImpl.sendRequest(RequestSpecificationImpl.groovy:801) 
     at com.jayway.restassured.internal.RequestSpecificationImpl.this$2$sendRequest(RequestSpecificationImpl.groovy) 
     at com.jayway.restassured.internal.RequestSpecificationImpl$this$2$sendRequest.call(Unknown Source) 
     at com.jayway.restassured.internal.filter.RootFilter.filter(RootFilter.groovy:30) 
     at com.jayway.restassured.filter.Filter$filter.call(Unknown Source) 
     at com.jayway.restassured.internal.filter.FilterContextImpl.next(FilterContextImpl.groovy:49) 
     at com.jayway.restassured.filter.FilterContext$next.call(Unknown Source) 
     at com.jayway.restassured.internal.RequestSpecificationImpl.invokeFilterChain(RequestSpecificationImpl.groovy:758) 
     at com.jayway.restassured.internal.RequestSpecificationImpl$invokeFilterChain.callCurrent(Unknown Source) 
     at com.jayway.restassured.internal.RequestSpecificationImpl.applyPathParamsAndSendRequest(RequestSpecificationImpl.groovy:1142) 
     at com.jayway.restassured.internal.RequestSpecificationImpl.this$2$applyPathParamsAndSendRequest(RequestSpecificationImpl.groovy) 
     at com.jayway.restassured.internal.RequestSpecificationImpl$this$2$applyPathParamsAndSendRequest.callCurrent(Unknown Source) 
     at com.jayway.restassured.internal.RequestSpecificationImpl.post(RequestSpecificationImpl.groovy:135) 
     at com.ibm.datatools.webauto.framework.common.BaseWebTest.login(BaseWebTest.java:53) 
     at com.ibm.datatools.webauto.dynamite.svt.ui.testcases.UDXTest.idaLogin(UDXTest.java:47) 
     at com.ibm.datatools.webauto.dynamite.svt.ui.testcases.UDXTest.beforeClass(UDXTest.java:62) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:498) 
     at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:85) 
     at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:510) 
     at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:211) 
     at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:138) 
     at org.testng.internal.TestMethodWorker.invokeBeforeClassMethods(TestMethodWorker.java:170) 
     at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:104) 
     at org.testng.TestRunner.privateRun(TestRunner.java:774) 
     at org.testng.TestRunner.run(TestRunner.java:624) 
     at org.testng.SuiteRunner.runTest(SuiteRunner.java:359) 
     at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:354) 
     at org.testng.SuiteRunner.privateRun(SuiteRunner.java:312) 
     at org.testng.SuiteRunner.run(SuiteRunner.java:261) 
     at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) 
     at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) 
     at org.testng.TestNG.runSuitesSequentially(TestNG.java:1215) 
     at org.testng.TestNG.runSuitesLocally(TestNG.java:1140) 
     at org.testng.TestNG.run(TestNG.java:1048) 
     at org.testng.TestNG.privateMain(TestNG.java:1355) 
     at org.testng.TestNG.main(TestNG.java:1324) 

注:提供の回答が残り、保証の新しいバージョンを考えてこれは、thisまたはthis質問の重複していないここで

そして、私が得た跡があります。私は私のコメントの一つで書いたように

+1

以下に私のために働きましたか?私はハンドシェイクの例外を推測していますが、スタックトレースを投稿できますか?また、証明書をJavaインストールのトラストストアにインポートしようとしましたか? – Adam

+0

@Adam:証明書をトラストストアにインポートすることについて。テスト環境が自動的に作成/生成されるので、テストセッションごとに証明書が1回生成されると想定できるので、これはオプションではないようです。テストの前にそのような証明書をダウンロードすることは可能ですか?テストセッション中に使用できる*一時的なトラストストアを作成し、この証明書をそのトラストストアに追加しますか? –

+0

エラーに基づいて、JVMの起動時に証明書をトラストストアにアップロードする必要があるようです。 http://stackoverflow.com/questions/373295/digital-certificate-how-to-import-cer-file-in-to-truststore-file-usingを参照してください。これはあなたの環境設定の一部でなければならず、恐ろしい官僚的な理由のために起こることはありませんが、本当の署名入り証明書を取得するか、テスト内に保存する以外のことはできません。推奨)。 – Adam

答えて

0

は私が解決しようとした:

  • は一時的なキーストアに残り、保証
  • 店舗サーバ証明書が使用する一時的なキーストアを作成します

    1. ダウンロードサーバ証明書を
    2. テスト中にサーバに接続するときに一時的なキーストアを使用します。

    ここにあります

    RestAssured.keystore(keystorePath, keystorePassword); 
    

    注:

    • getCertificates方法は、私がthis質問の下にpiece of codeに基づいています

      protected Certificate[] getCertificates(String url) throws IOException, GeneralSecurityException 
      { 
          URL urlConnection = new URL(url); 
          SSLContext context = SSLContext.getInstance("TLS"); 
          context.init(new KeyManager[0], new TrustManager[] {new DummyTrustManager()}, new SecureRandom()); 
          SSLContext.setDefault(context); 
      
          HttpsURLConnection con = (HttpsURLConnection)urlConnection.openConnection(); 
          con.setHostnameVerifier(
            new HostnameVerifier() { 
             public boolean verify(String hostname, SSLSession session) { 
              return true; 
              } 
          }); 
      
          con.setSSLSocketFactory(context.getSocketFactory()); 
          con.connect(); 
          Certificate[] certificates = con.getServerCertificates(); 
      
          con.disconnect(); 
          return certificates; 
      
      } 
      
      protected void storeCertificates(Certificate[] certs, String keystorePath, String keystorePassword) throws GeneralSecurityException, IOException 
      { 
          KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); 
          keystore.load(null, keystorePassword.toCharArray()); 
          for (Certificate c: certs) 
          { 
           keystore.setCertificateEntry(Integer.toHexString(c.hashCode()), c); 
          } 
          File f = new File(keystorePath); 
          FileOutputStream out_stream = new FileOutputStream(f); 
          keystore.store(out_stream, keystorePassword.toCharArray()); 
          out_stream.close(); 
      } 
      

      私がしなければならない唯一の事はその後:コードの重要な部分であります。 DummyTrustManagerは、DefaultTrustManagerとまったく同じです。

    • storeCertificatesthis質問とその答えです。
    • SSLContext.setDefault(context)SSLContextを変更した場合、私はまだわからないだけtemporarly(ダウンロードする証明書の中に)または永続的
  • 1

    それはあなたが何SSLエラーを取得している補正

    @Test 
    public void testUserFetchesSuccess(){ 
        given().config(RestAssured.config().sslConfig(new SSLConfig().allowAllHostnames())). 
        get(restUrl). 
        then().body("id", equalTo("abc0")); 
    } 
    
    +0

    安心1.8.1以前のバージョンでテストしましたか? –

    関連する問題