如何使用java中的Rest-Assured向需要证书的端点进行GET调用。我的证书格式为.pem
。在PEM文件中有证书和私钥。
答案 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。最好自己下载以确保使用正确的。下载所有认证链证书
然后,使用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 验证所涉及的过程类似于以下步骤,
现在要完成配置并进行http调用,请按照下列步骤操作
keytool -importcert -alias "[[证书的别名]]" -file [[证书名称]].pem -keystore [[信任库名称]].jks -storepass [[信任库密码]]
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版,此问题已解决。