使用Atlassian REST API连Jira遇SSL错误,开发环境如何关闭证书验证?
解决Jira REST API Java客户端的SSL握手错误(开发环境)
你猜的没错,这个错误完全是因为Jira使用的自签名证书没被你的JVM信任导致的。在开发环境下,我们确实可以通过自定义客户端配置来跳过证书验证,下面是具体的实现方法:
方法1:彻底关闭证书验证(仅开发环境使用!)
这种方式会绕过所有SSL证书校验,非常不安全,绝对不能用在生产环境。具体步骤是自定义一个HttpClient实例,禁用SSL验证,然后把它传给JiraRestClientFactory:
import com.atlassian.jira.rest.client.api.JiraRestClient; import com.atlassian.jira.rest.client.api.JiraRestClientFactory; import com.atlassian.jira.rest.client.internal.async.AsynchronousJiraRestClientFactory; import com.atlassian.httpclient.api.HttpClient; import com.atlassian.httpclient.apache.httpcomponents.DefaultHttpClient; import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.TrustStrategy; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.ssl.SSLContexts; import javax.net.ssl.SSLContext; import java.net.URI; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; public class JiraSslBypassExample { public static void main(String[] args) throws Exception { // 创建信任所有证书的策略 TrustStrategy trustAllCertificates = (X509Certificate[] chain, String authType) -> true; // 构建跳过证书校验的SSL上下文 SSLContext sslContext = SSLContexts.custom() .loadTrustMaterial(null, trustAllCertificates) .build(); // 创建忽略主机名验证的Socket工厂 SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory( sslContext, NoopHostnameVerifier.INSTANCE ); // 构建自定义HttpClient实例 CloseableHttpClient apacheHttpClient = HttpClients.custom() .setSSLSocketFactory(sslSocketFactory) .build(); HttpClient customHttpClient = new DefaultHttpClient(apacheHttpClient); // 使用自定义HttpClient创建JiraRestClient JiraRestClientFactory factory = new AsynchronousJiraRestClientFactory(); JiraRestClient restClient = factory.create( new URI("https://你的Jira实例地址"), new BasicHttpAuthenticationHandler("你的用户名", "你的密码"), customHttpClient ); // 这里就可以正常调用Jira API了 // 示例:获取当前用户信息 // System.out.println(restClient.getCurrentUser().get()); // 记得关闭客户端释放资源 restClient.close(); } }
方法2:导入自签名证书到JVM(更推荐的开发/测试方式)
如果不想完全禁用验证,你可以把Jira的自签名证书导入到JVM的信任存储中,这样既安全又能解决问题:
- 首先导出Jira的证书:通过浏览器访问Jira地址,点击地址栏的锁图标,导出证书为
.cer格式 - 然后用
keytool命令导入到JVM的cacerts存储:
keytool -import -alias jira-custom-cert -file /你的证书路径/jira-cert.cer -keystore $JAVA_HOME/jre/lib/security/cacerts
默认的cacerts密码是changeit,导入后重启你的应用,就不会再出现SSL错误了。
重要提醒:方法1只适合开发环境快速调试,生产环境必须使用受信任的合法证书,绝对不能禁用SSL验证!
内容的提问来源于stack exchange,提问作者Sebastian
相关产品推荐
相关产品推荐

