HTTPS和SSL的安全性:-javax.net.ssl.SSLHandshakeException:证书已过期

时间:2016-05-18 05:22:18

标签: java android apache ssl sslhandshakeexception

我已尝试使用此命令检查缺少中间证书颁发机构的命令

$ openssl s_client -connect mail.google.com:443

我的网站应该显示证书链,但它只显示一个已经过期的证书。 但是当我在https://www.digicert.com/help/

上检查服务器证书配置时

它显示SSL证书已正确安装并显示正确的中间证书链,当我尝试访问我的Android应用程序中的web api时,它显示以下错误: -

javax.net.ssl.SSLHandshakeException: Certificate expired at Thu Jun 11 21:58:21 GMT+05:30 2015 (compared to Wed May 18 10:48:45 GMT+05:30 2016)
05-18 10:48:45.750 28372-28412/com.src.giveup1 W/System.err:     at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:327)
05-18 10:48:45.750 28372-28412/com.src.giveup1 W/System.err:     at com.android.org.conscrypt.OpenSSLSocketImpl.waitForHandshake(OpenSSLSocketImpl.java:638)
05-18 10:48:45.750 28372-28412/com.src.giveup1 W/System.err:     at com.android.org.conscrypt.OpenSSLSocketImpl.getInputStream(OpenSSLSocketImpl.java:600)
05-18 10:48:45.750 28372-28412/com.src.giveup1 W/System.err:     at org.apache.http.impl.io.SocketInputBuffer.<init>(SocketInputBuffer.java:75)
05-18 10:48:45.750 28372-28412/com.src.giveup1 W/System.err:     at org.apache.http.impl.SocketHttpClientConnection.createSessionInputBuffer(SocketHttpClientConnection.java:93)
05-18 10:48:45.751 28372-28412/com.src.giveup1 W/System.err:     at org.apache.http.impl.conn.DefaultClientConnection.createSessionInputBuffer(DefaultClientConnection.java:187)
05-18 10:48:45.751 28372-28412/com.src.giveup1 W/System.err:     at org.apache.http.impl.SocketHttpClientConnection.bind(SocketHttpClientConnection.java:123)
05-18 10:48:45.751 28372-28412/com.src.giveup1 W/System.err:     at org.apache.http.impl.conn.DefaultClientConnection.openCompleted(DefaultClientConnection.java:134)
05-18 10:48:45.751 28372-28412/com.src.giveup1 W/System.err:     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:196)
05-18 10:48:45.751 28372-28412/com.src.giveup1 W/System.err:     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:169)
05-18 10:48:45.751 28372-28412/com.src.giveup1 W/System.err:     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:124)
05-18 10:48:45.751 28372-28412/com.src.giveup1 W/System.err:     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:365)
05-18 10:48:45.751 28372-28412/com.src.giveup1 W/System.err:     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:602)
05-18 10:48:45.751 28372-28412/com.src.giveup1 W/System.err:     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:522)
05-18 10:48:45.751 28372-28412/com.src.giveup1 W/System.err:     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:500)

我使用以下链接检查Android应用程序中的服务器证书: - http://blog.fordemobile.com/2012/04/https-requests-on-android.html

是否在服务器上正确配置了证书,或者我使用了错误的代码来检查证书。

1 个答案:

答案 0 :(得分:1)

您已经遇到了问题。 实际上您的证书已过期。 您的网络服务的应用服务器需要更新其证书。

有关创建和检查证书的完整教程,您可以按照教程进行操作:

  1. The Most Common OpenSSL Commands
  2. How To Verify SSL Certificate From A Shell Prompt
  3. 要更改证书,您可以按照以下教程进行操作:

    http://www.albeesonline.com/blog/2009/06/24/javax-net-ssl-sslhandshakeexception-certificate-expired/

    完整教程:

    出于测试目的,我将使用由mail.google.com:443颁发的Go Daddy SSL证书。

    步骤1:获取证书

    创建存储证书的目录:

    $ mkdir -p ~/.cert/mail.google.com/
    $ cd ~/.cert/mail.google.com/
    

    检索google邮件服务器提供的mail.google.com证书:

    $ openssl s_client -showcerts -connect mail.google.com:443
    
      

    从“--BEGIN CERTIFICATE--”复制到“--END CERTIFICATE--”,   并将其保存在~/.cert/mail.google.com/目录中   mail.google.com.pem

    步骤2:获得发行人的证书

    如果此证书是由Go Daddy发布的,那么您需要获得“证书颁发机构根证书”(访问您的CA网站以获取根证书):

    $ wget https://certs.godaddy.com/repository/gd_bundle.crt -O ~/.cert/mail.google.com/gd.pem
    

    步骤3:重新颁发证书

    使用c_rehash创建指向由哈希值命名的文件的符号链接,输入:

    $ c_rehash ~/.cert/mail.google.com/
    

    样本输出:

    Doing  ~/.cert/mail.google.com/
    mail.google.com.pem => 1d97af50.0
    gd.pem => 219d9499.0
    

    测试

    要确认您拥有正确且有效的证书,请输入:

    $ openssl s_client -CApath ~/.cert/mail.google.com/ -connect mail.google.com:443
    

    样本输出:

    CONNECTED(00000003)
    ......
    ....
     Verify return code: 0 (ok)
    ---
    

    应该有很多数据,但要注意的重要一点是最后一行“Verify return code: 0 (ok)”。我正在为dovecot IMAP邮件服务器使用相同的证书,键入以下内容以验证邮件服务器SSL证书:

    $ openssl s_client -CApath ~/.cert/mail.google.com/ -connect mail.google.com:993
    

    样本输出:

    CONNECTED(00000003)
    .....
    .....
        Verify return code: 0 (ok)
    ---
    * OK [CAPABILITY IMAP4rev1 SASL-IR SORT THREAD=REFERENCES MULTIAPPEND UNSELECT LITERAL+ IDLE CHILDREN NAMESPACE LOGIN-REFERRALS UIDPLUS LIST-EXTENDED I18NLEVEL=1 QUOTA AUTH=PLAIN AUTH=LOGIN] Dovecot ready.
    

    最后的“Dovecot ready”行以及0 return code indicates that everything is working fine

    资源链接:

    Verifying that a Private Key Matches a Certificate