如何在Rest-Assured java中使用证书进行HTTPS GET调用

时间:2016-04-01 08:56:45

标签: java certificate rest-assured

如何使用java中的Rest-Assured向需要证书的端点进行GET调用。我的证书格式为.pem。在PEM文件中有证书和私钥。

13 个答案:

答案 0 :(得分:19)

在我的案例中,使用“轻松的HTTPs验证”修复了我的问题:

given().relaxedHTTPSValidation().when().post("https://my_server.com")

答案 1 :(得分:8)

使用以下代码 -

KeyStore keyStore = null;
SSLConfig config = null;

try {
        keyStore = KeyStore.getInstance("PKCS12");
        keyStore.load(
                new FileInputStream("certs/client_cert_and_private.p12"),
                password.toCharArray());

    } catch (Exception ex) {
        System.out.println("Error while loading keystore >>>>>>>>>");
        ex.printStackTrace();
    }

    if (keyStore != null) {

        org.apache.http.conn.ssl.SSLSocketFactory clientAuthFactory = new org.apache.http.conn.ssl.SSLSocketFactory(keyStore, password);

        // set the config in rest assured
        config = new SSLConfig().with().sslSocketFactory(clientAuthFactory).and().allowAllHostnames();

RestAssured.config = RestAssured.config().sslConfig(config);
RestAssured.given().when().get("/path").then();

答案 2 :(得分:3)

我是新手,但我知道使用数字证书进行客户端身份验证的这类问题

在rest-assured doc中,只能配置证书:JKS

RestAssured.config = RestAssured.newConfig().sslConfig(new SSLConfig("/truststore_javanet.jks", "test1234");

将您的PEM转换为JKS。使用portecle打开它并确保密码正确并且您已加载证书并且所有证书链都到CA根目录。 Portecle使用GUI简化命令行,并允许您创建JKS

http://portecle.sourceforge.net/

当您的Java客户端不信任服务器证书

时,始终会发生此错误
 PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

解决此问题的最简单方法是在jdk密钥库中包含服务器证书链。

首先,下载用浏览器打开https连接的服务器证书,例如使用chrome。失败并不重要。单击工具栏中的绿色锁定>详细信息>查看服务器证书并下载为PEM。最好自己下载以确保使用正确的。下载所有认证链证书 enter image description here

然后,使用portecle在JDK_HOME / jre / lib / security中打开jdk cacerts。密码将被更改为'。将服务器证书添加为“受信任的'

现在,PKIX路径构建失败将消失。如果没有,请检查证书和正在使用的JDK

答案 3 :(得分:2)

下面提到的代码正常,

public static void getArtifactsHttps(String args) {
    String username = "username";
    String password1 = "password";
    StringBuilder authorization = new StringBuilder();
    authorization.append(username).append(":").append(password);
    String authHeader = "Basic " + Base64.getEncoder().encodeToString(authorization.toString().getBytes());


    String response = RestAssured
            .given()
            .trustStore("D:\\workspace\\DemoTrust.jks", "DemoTrustKeyStorePassPhrase")
            .when()
            .contentType(MediaType.APPLICATION_JSON)
            .accept(MediaType.APPLICATION_JSON)
            .header("Authorization", authHeader)
            .baseUri("https://server.us.oracle.com:55898")
            .queryParam("name", args)
            .get("/validendpoint").prettyPrint();

    System.out.println("RESPONSE" + response);
}

答案 4 :(得分:2)

使用RestAssured 3.0我使用@ rohitkadam19的代码并使其正常工作:

@Before
public void setUp() throws Exception {
    try {
        RestAssured.port = port;
        RestAssured.useRelaxedHTTPSValidation();
        RestAssured.config().getSSLConfig().with().keyStore("classpath:keystore.p12", "password");
    } catch (Exception ex) {
        System.out.println("Error while loading keystore >>>>>>>>>");
        ex.printStackTrace();
    }
}

答案 5 :(得分:0)

现在不建议使用org.apache.http.conn.ssl.SSLSocketFactory的方法。如果您使用的是RestAssured中最新的io版本,那么最好的方法是使用以下方法设置身份验证:

    RestAssured.authentication =
        RestAssured.certificate(
            "/path/to/truststore",
            "trust store password",
            "/path/to/p12",
            "p12 password",
            CertificateAuthSettings.certAuthSettings());

请注意,CertificateAuthSettings.certAuthSettings()使用默认的KeyStore设置,因此请注意这一点。

答案 6 :(得分:0)

您需要允许RestAssured客户端使用自签名证书。为此,您需要将证书(公钥)放入信任库(而非密钥库)。

RestAssured
  .config()
  .sslConfig(
    sslConfig().with().trustStoreType("PKCS12").and()
      .trustStore(ResourceUtils.getFile("classpath:keystore/keystore.p12"), "password"));

答案 7 :(得分:0)

// headerMap是标题的映射 取得

Response response = given().headers(headerMap)
.config(RestAssuredConfig.config().decoderConfig(DecoderConfig.decoderConfig().defaultContentCharset("UTF-8")).and().sslConfig(new SSLConfig().relaxedHTTPSValidation())) .contentType(ContentType.JSON).when().get(url).then().extract().response();

发布

response =   given().headers(headerMap) .config(RestAssuredConfig.config().decoderConfig(DecoderConfig.decoderConfig().defaultContentCharset("UTF-8")).and().sslConfig(new SSLConfig().relaxedHTTPSValidation()))
.contentType(ContentType.JSON).body(body).when().post(url).then().extract().response();

答案 8 :(得分:0)

这对我有用,谢谢大家。我正在使用 RestAssured v 3.0,这是用于 Post 但我们可以将其更改为 .get() 并删除 .body(...)

    ResponseSpecification responseSpec = null;
    Response response123 = null;
    
    RestAssured.config = RestAssured.config().sslConfig(
            new SSLConfig().keystore("app trust.jks", password)
                    .keystore("key trust.jks", password));
    
    responseSpec = given()
            .urlEncodingEnabled(Encode url = true or false)
            .body(BodyToPOST)
            .config(RestAssured.config())
            .contentType("application/json")
            .headers(appropriate headers)
            .expect()
            .statusCode(200);
    
    response123 = responseSpec.when()
            .post(url)
            .then()
            .extract()
            .response();

答案 9 :(得分:0)

在 4.3.3 版的 RestAssured 上,我对这些答案几乎没有任何运气。

我终于发现了:RestAssured.trustStore(truststoreFilePath, password)

用法:

String truststore = Props.getStringProperty("truststore", ""); // truststore in jks format
if (StringUtils.isNotBlank(truststore)) {
    File truststoreFile = new File(truststore);
    if (!truststoreFile .exists()) {
        throw new RuntimeException("Could not initialize the truststore 
 because file specified does not exist: " + truststore);
    }
    String password = Props.getStringProperty("truststorePassword", "changeit");
    RestAssured.trustStore(truststoreFile.getAbsolutePath(), password);
}

现在

RestAssured.given()
    .auth().basic(Props.getStringProperty("user"), Props.getStringProperty("authToken"))
    .with().config(RestAssured.config().connectionConfig(new ConnectionConfig())).when().get("/my-service")

不再有 SSL 握手问题。

答案 10 :(得分:0)

要了解这种情况,如果您向其发出请求的服务器配置了自签名 SSL 证书,则您必须查看此答案。信任 SSL 证书在 CA(证书颁发机构)的帮助下由浏览器自动验证,但如果是自签名 SSL,我们必须为其余客户端配置信任库(在这种情况下请放心)。

什么是信任库?

Truststore 是一种保管库,您可以在其中放置您认为有效的证书,进一步解释一下,https 验证所涉及的过程类似于以下步骤,

  1. 您向服务器发出请求
  2. 服务器发送证书
  3. 现在验证证书是客户端的责任,如果它是信任 SSL,那么浏览器/http 客户端会接近 CA 来验证证书的真实性,但是由于它是自签名 SSL,我们必须配置它应该使用的 http 客户端验证证书的方法,该配置是信任库的配置

现在要完成配置并进行http调用,请按照下列步骤操作

  1. 在您的项目中创建一个扩展名为“jks”的信任库文件,必须在创建 jks 文件时配置密码。
  2. 从浏览器下载证书或使用创建的证书(两者都一样),证书扩展名通常是“pem”或“crt”
  3. 现在我们需要将证书导入信任库(*.jks 文件),在终端中运行以下命令
<块引用>

keytool -importcert -alias "[[证书的别名]]" -file [[证书名称]].pem -keystore [[信任库名称]].jks -storepass [[信任库密码]]

  1. 现在我们需要配置放心,它应该使用这个信任库进行 https 验证
<块引用>

given().config(newConfig().sslConfig(new SSLConfig("/truststore.jks", "truststorepassword")))

我们可以使用上面的实例来执行http get请求, given().config(newConfig().sslConfig(new SSLConfig("/truststore.jks", "truststorepassword"))).get("URL")

答案 11 :(得分:-1)

请使用最新版本3.0.7,因为在以前版本中,当您使用证书测试服务时,已经面临许多问题

答案 12 :(得分:-1)

实际上,以上解决方案也对我有用。之前我也遇到过同样的错误:javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure

使用最新的RestAssured版本:pom.xml中的3.0.7版,此问题已解决。