Java 使用https(SSL的自签名证书)连接到VPS上的解析服务器
出于某些原因,Parse用户必须将其解析环境迁移到VPS(我的问题就是这样)或Heroku、AWS(不需要这些平台)等。Android有一个新的Parse SDK(1.13.0),它允许使用新的解析接口初始化连接,如下所示:Java 使用https(SSL的自签名证书)连接到VPS上的解析服务器,java,android,parse-platform,https,self-signed,Java,Android,Parse Platform,Https,Self Signed,出于某些原因,Parse用户必须将其解析环境迁移到VPS(我的问题就是这样)或Heroku、AWS(不需要这些平台)等。Android有一个新的Parse SDK(1.13.0),它允许使用新的解析接口初始化连接,如下所示: Parse.initialize(new Parse.Configuration.Builder(this) .applicationId("myAppId") .clientKey(null)
Parse.initialize(new Parse.Configuration.Builder(this)
.applicationId("myAppId")
.clientKey(null)
.addNetworkInterceptor(new ParseLogInterceptor())
.server("https://VPS_STATIC_IP_ADDRESS/parse/").build());
此类请求使用端口443完成。适当的.js
(nodejs)连接器文件已经编辑好,因此端口443在本地连接到端口1337(端口侦听器),当在浏览器中访问解析服务器时(当然是从外部VPS远程访问),可以应用自签名证书并进一步访问。但当Android应用程序(启动器)尝试连接它时,由于自签名证书,它无法连接。在Parse SDK中是否有可能应用自签名证书
另外,关于这个问题是否真的有一个bug,这就是为什么发布1.13.1解析版本的原因?如果是,在哪里可以获得这个版本的jar库
谢谢大家! 我刚刚解决了这个问题-
android的Parse SDK在自签名证书中没有现成的支持。
您需要自己修改代码
第一步-相关代码段位于ParseHttpClient中
public static ParseHttpClient createClient(int socketOperationTimeout,
SSLSessionCache sslSessionCache) {
String httpClientLibraryName;
ParseHttpClient httpClient;
if (hasOkHttpOnClasspath()) {
httpClientLibraryName = OKHTTP_NAME;
httpClient = new ParseOkHttpClient(socketOperationTimeout, sslSessionCache);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
httpClientLibraryName = URLCONNECTION_NAME;
httpClient = new ParseURLConnectionHttpClient(socketOperationTimeout, sslSessionCache);
} else {
httpClientLibraryName = APACHE_HTTPCLIENT_NAME;
httpClient = new ParseApacheHttpClient(socketOperationTimeout, sslSessionCache);
}
PLog.i(TAG, "Using " + httpClientLibraryName + " library for networking communication.");
return httpClient; }
如果您的目标支持是更高级的版本,那么KITKAT-
然后需要添加ParseURLConnectionHttpClient构造函数:
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier(){
public boolean verify(String hostname, SSLSession session) {
if(hostname.equals("YOUR TARGET SERVER")) {
return true;
}
return false;
}});
在其他情况下(旧版本),代码将落在Apache上,我无法使用它-因此我做了以下工作:我将okhttp库添加到我的应用程序中(以版本2.4为例-与构建中解析指示的相同,最新版本具有不同的包名)然后代码将进入第一个条件,因为它将在路径上找到okhttp。
您可能应该替换if条件顺序,这样它将只在少于KITKAT的版本上发生
在ParseOkHttpClient中,添加以下自签名证书代码:
public void initCert() {
try {
Log.i("PARSE","initCert");
CertificateFactory cf = CertificateFactory.getInstance("X.509");
String yairCert = "-----BEGIN CERTIFICATE-----\n" +
YOUR CERTIFICATE HERE
"-----END CERTIFICATE-----\n";
InputStream caInput = new ByteArrayInputStream(yairCert.getBytes());
Certificate ca = null;
try {
ca = cf.generateCertificate(caInput);
System.out.println("ca=" + ((X509Certificate) ca).getSubjectDN());
} catch (CertificateException e) {
e.printStackTrace();
} finally {
try {
caInput.close();
} catch (IOException e) {
Log.e("PARSE_BUG","Failure on Cert installing",e);
e.printStackTrace();
}
}
// Create a KeyStore containing our trusted CAs
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
// Create a TrustManager that trusts the CAs in our KeyStore
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
// Create an SSLContext that uses our TrustManager
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, tmf.getTrustManagers(), null);
Log.i("PARSE","Initiating Self Signed cert");
okHttpClient.setSslSocketFactory(context.getSocketFactory());
try {
cf = CertificateFactory.getInstance("X.509");
} catch (CertificateException e) {
Log.e("PARSE_BUG","Failure on Cert installing",e);
e.printStackTrace();
}
} catch (IOException e) {
Log.e("PARSE_BUG","Failure on Cert installing",e);
e.printStackTrace();
} catch (CertificateException e) {
Log.e("PARSE_BUG","Failure on Cert installing",e);
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
Log.e("PARSE_BUG","Failure on Cert installing",e);
e.printStackTrace();
} catch (KeyStoreException e) {
Log.e("PARSE_BUG","Failure on Cert installing",e);
e.printStackTrace();
} catch (KeyManagementException e) {
Log.e("PARSE_BUG","Failure on Cert installing",e);
e.printStackTrace();
}
最后一部分是调用此方法+验证主机名,它也应该发生在构造函数中。
initCert();
okHttpClient.setHostnameVerifier(新的HostnameVerifier(){
@凌驾
公共布尔验证(字符串s,SSLSession SSLSession){
如果(s.equals(“您的目标服务器”)){
返回true;
}
返回false;
}
});
就这样。本地构建解析并部署到你的应用程序中,它将像一个魔咒一样工作
享受你可能应该修正标题中的拼写错误。。。