
# 如何检查SSL/TLS认证异常?
当您使用ELB的HTTPS或TLS监听器时，可能会遇到SSL/TLS认证协商失败导致的错误。由于协商过程涉及多个步骤，因此可能出现多种错误，您可以参考以下内容从客户端收到响应进行排查。
本文以java语言为例，提供常见错误排查建议。
#### 排查项一：服务器未提供证书满足客户端校验要求
- 报错信息：
  ```
  Exception in thread "main" javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
  ```
  
- 异常原因：ELB服务器没有提供证书或者提供的证书不符合客户端的校验要求，导致握SSL/TLS手失败。
- 解决方案：
  - 请检查监听器上配置的证书是否正确。
  
  - 请确认监听器的TLS安全策略使用的加密套件是否满足客户端要求。
   
 
#### 排查项二：证书验证报错
- 报错信息：
  ```
  Exception in thread "main" javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
  ```
  
- 异常原因：服务器证书校验时，证书验证报错，可能是证书链不完整或证书颁发机构不受信任。
- 解决方案：将监听器的证书更换为有效的由证书颁发机构（CA）签发的证书。
 
#### 排查项三：客户端收到的服务器证书主机名与请求主机名不匹配
- 报错信息：
  ```
  Exception in thread "main" javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching localhost found
  ```
  
- 异常原因：通常发生在双向认证场景，客户端接收到服务器证书主机名与客户端请求连接的主机名不匹配，即验证localhost失败。
- 解决方案：请检查请求客户端是否携带包含localhost的证书。
 
#### 排查项四：TLS安全策略的版本不匹配
- 报错信息：
  ```
  Exception in thread "main" javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
  ```
  
- 异常原因：客户端和服务器之间无法找到共同支持的SSL/TLS协议版本或加密套件。
- 解决方案：请检查客户端和ELB监听器使用的TLS安全策略的TLS协议版本、加密套件的版本是否匹配。
 
