配置PFX证书的Rest-Assured请求持续返回401错误,求解决方案
问题:RESTAssured使用PFX证书调用HTTPS接口返回401错误
使用PFX证书调用HTTPS接口时,通过ReadyAPI测试可正常返回200,但自行编写的RESTAssured代码始终返回401状态码。已确认证书路径、密码及接口端点均无问题,代码如下:
@Test void testPfxKey() { // Source: https://stackoverflow.com/questions/42235588/restassured-use-pfx-certificate-for-https-call FileInputStream instream1=null; KeyStore keyStore=null; org.apache.http.conn.ssl.SSLSocketFactory lSchemeSocketFactory=null; try { instream1 = new FileInputStream(new File("C:/Path/To/pfxfile.pfx")); keyStore = KeyStore.getInstance("PKCS12"); keyStore.load(instream1, "pfxfilepwd".toCharArray()); X509HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER; lSchemeSocketFactory = new org.apache.http.conn.ssl.SSLSocketFactory(keyStore, "pfxfilepwd"); lSchemeSocketFactory.setHostnameVerifier(hostnameVerifier); } catch (Exception e) { e.printStackTrace(); } RestAssured.config = RestAssured.config().sslConfig(new SSLConfig().with().sslSocketFactory(lSchemeSocketFactory).and().allowAllHostnames().relaxedHTTPSValidation()); RestAssured.given(). contentType("application/json"). headers( "Subscription-Key", "key-value", "Accept-Encoding", "gzip,deflate" ); Response response = RestAssured.get("https://endpoint.net/resource/path"); System.out.println(response.getStatusCode()); }
解决方法
修复链式调用问题
原代码中RestAssured.given()设置的请求头和ContentType没有与get()方法链式关联,导致这些配置未生效。需将配置与请求发起操作绑定:RequestSpecification requestSpec = RestAssured.given() .contentType("application/json") .headers( "Subscription-Key", "key-value", "Accept-Encoding", "gzip,deflate" ); Response response = requestSpec.get("https://endpoint.net/resource/path");简化SSL配置避免冲突
原代码同时设置allowAllHostnames()和relaxedHTTPSValidation(),可能导致配置冲突。保留必要的SSL配置即可:// 加载密钥库后配置SSL SSLConfig sslConfig = new SSLConfig() .sslSocketFactory(lSchemeSocketFactory) .allowAllHostnames(); RestAssured.config = RestAssured.config().sslConfig(sslConfig);验证证书加载状态
在catch块前添加日志,确认密钥库是否成功加载证书,避免因加载异常(如密码错误)导致SocketFactory为null:// 密钥库加载后添加 System.out.println("密钥库中证书条目数:" + keyStore.size());对比请求头与ReadyAPI的差异
开启RESTAssured日志功能,打印实际发送的请求和响应,对比ReadyAPI的请求头,确保没有遗漏或错误的参数:RequestSpecification requestSpec = RestAssured.given() .contentType("application/json") .headers( "Subscription-Key", "key-value", "Accept-Encoding", "gzip,deflate" ) .log().all(); // 打印请求详情 Response response = requestSpec.get("https://endpoint.net/resource/path"); response.log().all(); // 打印响应详情
内容的提问来源于stack exchange,提问作者Said
相关产品推荐
相关产品推荐

