【发布时间】:2014-06-13 03:25:39
【问题描述】:
最近我在从事实施 SSL 的项目。
SSL 证书每年过期一次。在我更新服务器上的证书后,它会在 android 中引发异常。
06-13 11:20:27.709: D/allenj(30076): javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: 找不到证书路径的信任锚。
查看项目代码后,我看到有一个bks文件,那么,是否意味着我必须每年更新一次bks文件,并且我必须将应用程序重新上传到google play。
问题是应对SSL证书更新的标准方法是什么?感谢您的帮助。
代码提取
nnable Register_runnable = new Runnable(){
@Override
public void run() {
EditText emailText = (EditText) findViewById(R.id.editText1regist);
EditText pwText = (EditText) findViewById(R.id.editText2registpw);
String end = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
try {
KeyStore keyStore = KeyStore.getInstance("BKS");
InputStream in =
getResources().openRawResource(R.raw.ballooncardbks);
keyStore.load(in, "".toCharArray());
TrustManagerFactory tmf =
TrustManagerFactory.getInstance("X509");
tmf.init(keyStore);
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, tmf.getTrustManagers(), null);
String actionUrl = "https://app.ballooncard.com/api/client/register/format/json";
URL url = new URL(actionUrl);
HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
// con.setDoInput(true);
con.setDoOutput(true);
con.setUseCaches(false);
con.setRequestMethod("POST");
con.setSSLSocketFactory(context.getSocketFactory());
con.setRequestProperty("Connection", "Keep-Alive");
con.setRequestProperty("Charset", "UTF-8");
con.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
【问题讨论】:
-
更新证书后可以防止上述异常吗?谢谢
-
证书固定是一个很好的安全控制。 在你接受放弃它的建议之前,你应该和一些了解网络安全模型和 PKIX 的安全人员交谈。如果我是您的安全人员,我会拒绝该请求并告诉您更新客户端中的固定证书。
-
而且您不需要将证书存储在 KeyStore 中(就像它一样隐藏起来)。您可以将其以纯文本形式存储为文件资源,甚至可以将其作为字符串硬编码到您的应用程序中。例如,请参阅Options for Programatically Adding Certificates to Java KeyStore。
-
顺便说一句....这将返回一个 SSL 上下文(而不是 TLS 独占上下文):
SSLContext.getInstance("TLS")。也应该对其进行强化——协议强化和密码套件强化。例如,将启用 SSLv3,禁用 TLS 1.1 和 1.2。例如,请参阅Which Cipher Suites to enable for SSL Socket?。