Rest-Assured in Java証明書を必要とするエンドポイントに対して。.pem
形式の証明書があります。PEMファイルで証明書と秘密鍵があります。
次のコードで動作しました-
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();
私の場合、「緩和されたHTTPS検証」を使用して私の問題を修正しました:
given().relaxedHTTPSValidation().when().post("https://my_server.com")
私は安心して初めてですが、クライアント認証にデジタル証明書を使用するこの種の問題を知っています
安心のドキュメントでは、証明書を構成するための唯一のオプションです: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キーストアにサーバー証明書チェーンを含めることです。
まず、ブラウザ(たとえばchrome)でhttps接続を開くサーバー証明書をダウンロードします。失敗しても構いません。ツールバーの緑色のロックをクリックします>詳細>サーバー証明書を参照し、PEMとしてダウンロードします。正しいものを使用していることを確認するには、自分でダウンロードすることをお勧めします。証明書チェーンのすべての証明書をダウンロード
次に、portecleでJDK_HOME/jre/lib/securityのjdk cacertsを開きます。パスワードは「changeit」になります。サーバー証明書を「信頼済み」として追加します
これで、PKIXパスの構築に失敗すると消えます。そうでない場合は、使用している証明書とJDKを確認してください
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();
}
}
下記のコードは機能しますが、
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);
}