首页  编辑  

Java/HTTPS/SSL/TLS自签名证书的验证

Tags: /Java/   Date Created:
Java中,自签名证书,如果不导入Java环境,那么使用SSL连接的时候,https会报证书验证问题,我们需要实现自己加载证书通过验证。
HTTPS连接:
  1. HttpsURLConnection con = null;
  2. BufferedReader in = null;
  3. try {
  4.     // 读取证书文件
  5.     FileInputStream fis = new FileInputStream(CERTIFICATE_PATH);
  6.     KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
  7.     keyStore.load(fis, null);
  8.     // 加载信任管理器
  9.     TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
  10.     tmf.init(keyStore);
  11.     // 初始化SSL上下文
  12.     SSLContext ctx = SSLContext.getInstance("TLS");
  13.     ctx.init(null, tmf.getTrustManagers(), null);
  14.     // 打开连接
  15.     URL obj = new URL(url);
  16.     con = (HttpsURLConnection) obj.openConnection();
  17.     con.setSSLSocketFactory(ctx.getSocketFactory());
  18.     // 设置请求头
  19.     con.setRequestMethod("GET");
  20.     con.setRequestProperty("User-Agent""Mozilla/5.0");
  21.     // 获取响应体
  22.     int responseCode = con.getResponseCode();
  23.     System.out.println("Response Code : " + responseCode);
  24.     in = new BufferedReader(new InputStreamReader(con.getInputStream()));
  25.     String inputLine;
  26.     StringBuilder response = new StringBuilder();
  27.     while ((inputLine = in.readLine()) != null) {
  28.         response.append(inputLine);
  29.     }
  30.     return response.toString();
  31. catch (Exception e) {
  32.     // TODO 处理异常
  33. finally {
  34.     try {
  35.         if (in != null) {
  36.             in.close();
  37.         }
  38.         if (con != null) {
  39.             con.disconnect();
  40.         }
  41.     } catch (IOException e) {
  42.         // TODO 处理异常
  43.     }
  44. }

使用Apache Http Client库连接场景
  1. // 使用`loadTrustMaterial()`方法将证书文件加载到信任存储中,传递证书路径、密码和`TrustSelfSignedStrategy`以验证证书
  2. SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(new File(CERT_PATH), CERT_PASSWORD.toCharArray(), new TrustSelfSignedStrategy()).build();
  3. HttpClient httpClient = HttpClients.custom().setSSLContext(sslContext).build();
  4. HttpGet httpGet = new HttpGet(URL);
  5. HttpResponse response = httpClient.execute(httpGet);
  6. HttpEntity entity = response.getEntity();
  7. String content = EntityUtils.toString(entity);

使用SSH协议进行连接场景:
  1. import com.jcraft.jsch.*;
  2. public class SSHConnection {
  3.     private static final String SERVER_ADDRESS = "example.com";
  4.     private static final String USERNAME = "username";
  5.     private static final String PRIVATE_KEY_PATH = "/path/to/private/key";
  6.     public static void main(String[] args) {
  7.         JSch jsch = new JSch();
  8.         try {
  9.             jsch.addIdentity(PRIVATE_KEY_PATH);
  10.             Session session = jsch.getSession(USERNAME, SERVER_ADDRESS);
  11.             //启用严格的主机密钥检查
  12.             session.setConfig("StrictHostKeyChecking""yes");
  13.             session.connect();
  14.             System.out.println("Connected");
  15.             // execute commands or transfer files here
  16.             session.disconnect();
  17.         } catch (JSchException e) {
  18.             // TODO 处理异常
  19.         }
  20.     }
  21. }