爲了演示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端添加證書成功。