[英]SSL Pinning Certificate
public static SSLContext getSSL() {
try {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
AssetManager assetManager = App.getAppContext()
.getAssets();
InputStream caInput = assetManager.open("cert.pem");
java.security.cert.X509Certificate ca = null;
try {
ca = (java.security.cert.X509Certificate) cf
.generateCertificate(caInput);
} catch (Exception er) {
} finally {
caInput.close();
}
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca",
ca);
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory
.getInstance(tmfAlgorithm);
tmf.init(keyStore);
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, tmf.getTrustManagers(), null);
return context;
} catch (Exception e1) {
return null;
}
}
好的,這就是我在Android應用程序中進行SSL固定的方式,並且一切正常。 那么,我有什么問題? 我的資產文件夾中有cert.pem,如果要更新證書怎么辦? 為此,我將不得不在商店上發布一個新的應用程序。 我不想這樣做,我想知道什么是處理此類問題的最佳方法? 我應該從某個地方下載證書並使用它,還是可以通過Google Play商店指定證書,並且可以從那里而不是資產文件夾中讀取證書? 我的目標是避免每次更改證書時都發布新的android應用。
證書固定的目的是減輕中間人(MITM)攻擊。 如果您從非固定來源下載固定證書,那么阻止MITM的狀況就不會更好,因為此下載源已成為MITM目標。
因此,只需將您想要的圖釘發送給您的應用即可。
緩解更新問題的選項:
自行生成或購買具有較長有效期的證書,因此您不必經常進行更新。
如果您使用的是購買的CA支持的證書,請不要固定證書本身,而要固定幾十年的CA根證書。 當然,這使MITM可以使用與該CA簽署的域證書來啟用MITM,但是至少您將需要信任的CA數量減少到一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.