Android訪問Https協議的接口

爲了演示Android端要訪問一個基於Https協議的接口,下面教大家如何快速的開發一個Servlet接口

1.開發一個基於Https協議接口

1.在eclipse中新建一個動態web項目,如下圖:

2.新建一個HttpsTest項目。這是一個javaweb項目

3.開發一個Servlet接口, 直接向客戶端返回一個字符串.

其中@WebServlet(“/test”)是提高給外部訪問的路徑,例如上面接口提供給外部訪問的路徑是:

http:// IP 地址 : 端口 /HttpsTest/test 或者 https : // IP 地址 : 端口 /HttpsTest/test

4.將該項目發佈在的tomcat中。發佈的過程自行百度。

5.測試項目是否部署成功。可以直接訪問開發好的接口。出現下面hello https代表接口開發完畢並且並部署完畢。下面訪問的接口使用的協議還是http,那麼如何實現訪問該接口使用https協議呢?解決方案:tomcat配置支持使用Https協議,配置好tomat之後就可以直接使用https協議訪問該接口。

6.tomcat配置支持使用Https協議

定位到tomcat服務器的安裝目錄, 找到conf下的server.xml文件

找到server.xml文件中如下已經被註釋的代碼:

去掉框中代碼的註釋,修改成下面

參數說明:
keystoreFile="D:\Java\jdk1.8.0_6\bin\test_server.jks"   服務器端證書的路徑
kestorePass="123456"  服務器端證書的密鑰
prot="443" https的默認端口是443, 這裏將端口8443改爲了443

7.重新啓動Tomcat。這時可以使用Https協議訪問上面開發好的接口。提示該接口不安全,因爲缺少證書

2.客戶端證書生成

服務器端開發的接口使用了Https協議,那麼Android端在使用https協議訪問服務器時必須先要添加證書驗證。那麼Android端的證書怎麼獲取呢?這裏可以根據服務器端的證書來生成客戶端的證書。例如,服務器端的證書是test_server.jks, 那麼就可以通過test_server.jks生成客戶端證書test_server.cer。生成步驟看下面指令:

打開cmd命令行,進入到jdk的bin目錄下執行下面的指令,然後會在當前目錄生成相應的客戶端證書(test_server.cer)

keytool -export -alias test_server -file test_server.cer -keystore test_server.jks -storepass 123456

參數說明:
“test_server.cer” 客戶端證書保存的路勁,這裏保存在當前路徑下
“test_server.jks” 服務器端證書路勁,這裏是在當前文件夾下(客戶端證書的生成依賴服務器端的證書)
“123456” 服務器端證書密鑰

如圖:

3.Android端添加證書

1.新建一個Android項目

2.引入OKHttp框架

3.訪問上面開發好的https://xxxx:xxxx/TestHttps/test接口

訪問接口的代碼

請求返回的結果:

因爲接口使用了https的協議,Android端沒有添加相應的證書,所以請求結果報如下錯

4.添加證書

添加證書的方法setCertificates具體的邏輯:

 public void setCertificates(InputStream... certificates)
    {
        try
        {
            CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
            keyStore.load(null);
            int index = 0;
            for (InputStream certificate : certificates)
            {
                String certificateAlias = Integer.toString(index++);
                keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(certificate));
                try
                {
                    if (certificate != null)
                        certificate.close();
                } catch (IOException e)
                {
                }
            }
            SSLContext sslContext = SSLContext.getInstance("TLS");
            TrustManagerFactory trustManagerFactory =
                    TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            trustManagerFactory.init(keyStore);
            sslContext.init
                    (
                            null,
                            trustManagerFactory.getTrustManagers(),
                            new SecureRandom()
                    );
            //給okHttpClient添加證書        
            okHttpClient.setSslSocketFactory(sslContext.getSocketFactory());
            okHttpClient.setHostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            });
        } catch (Exception e)
        {
            e.printStackTrace();
        }

    }

添加證書後Android 再次發送請求,能獲取到服務器返回的結果,證明Android端添加證書成功。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章