最近发布了一个关于HttpClient过度Https 的问题(在这里找到).我已经取得了一些进展,但我遇到了新的问题.和我的上一个问题一样,我似乎无法找到适合我的任何地方的例子.基本上,我希望我的客户端接受任何证书(因为我只指向一个服务器),但我一直在接受javax.net.ssl.SSLException: Not trusted server certificate exception.
所以这就是我所拥有的:
public void connect() throws A_WHOLE_BUNCH_OF_EXCEPTIONS {
HttpPost post = new HttpPost(new URI(PROD_URL));
post.setEntity(new StringEntity(BODY));
KeyStore trusted = KeyStore.getInstance("BKS");
trusted.load(null, "".toCharArray());
SSLSocketFactory sslf = new SSLSocketFactory(trusted);
sslf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme ("https", sslf, 443));
SingleClientConnManager cm = new SingleClientConnManager(post.getParams(),
schemeRegistry);
HttpClient client = new DefaultHttpClient(cm, post.getParams());
HttpResponse result = client.execute(post);
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
W/System.err( 901): javax.net.ssl.SSLException: Not trusted server certificate
W/System.err( 901): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:360)
W/System.err( 901): …Run Code Online (Sandbox Code Playgroud) 我正在创建一个https用于与服务器通信的android应用程序.我正在使用retrofit并OkHttp提出请求.这些适用于标准http请求.以下是我遵循的步骤.
步骤1: 使用该命令从服务器获取cert文件
echo -n | openssl s_client -connect api.****.tk:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > gtux.cert
Run Code Online (Sandbox Code Playgroud)
步骤2: 使用以下命令将证书转换为BKS格式
keytool -importcert -v -trustcacerts -file "gtux.cert" -alias imeto_alias -keystore "my_keystore.bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "bcprov-jdk16-146.jar" -storetype BKS
Run Code Online (Sandbox Code Playgroud)
它问我密码并且文件已成功创建.
第3步:
创建一个OkHttpClient并使用它来发出https请求
public class MySSLTrust {
public static OkHttpClient trustcert(Context context){
OkHttpClient okHttpClient = new OkHttpClient();
try {
KeyStore ksTrust = KeyStore.getInstance("BKS");
InputStream instream = context.getResources().openRawResource(R.raw.my_keystore);
ksTrust.load(instream, "secret".toCharArray());
// TrustManager decides which certificate authorities to …Run Code Online (Sandbox Code Playgroud) 我已经开始为API编写一个包装器,它要求所有请求都通过HTTPS.我在开发和测试时不是向实际的API发出请求,而是想在本地运行我自己的服务器来模拟响应.
我很困惑如何生成我需要创建HTTPS服务器并向其发送请求的证书.
我的服务器看起来像这样:
var options = {
key: fs.readFileSync('./key.pem'),
cert: fs.readFileSync('./cert.pem')
};
https.createServer(options, function(req, res) {
res.writeHead(200);
res.end('OK\n');
}).listen(8000);
Run Code Online (Sandbox Code Playgroud)
pem文件生成为:
openssl genrsa 1024 > key.pem
openssl req -x509 -new -key key.pem > cert.pem
Run Code Online (Sandbox Code Playgroud)
请求看起来像这样:
var options = {
host: 'localhost',
port: 8000,
path: '/api/v1/test'
};
https.request(options, function(res) {
res.pipe(process.stdout);
}).end();
Run Code Online (Sandbox Code Playgroud)
有了这个设置,我想Error: DEPTH_ZERO_SELF_SIGNED_CERT,我想我需要ca为请求添加一个选项.
所以我的问题是我应该如何生成以下内容:
key?cert?ca为请求?我已经阅读了一些关于使用openssl生成自签名证书的事情,但似乎无法绕过它并找出在我的节点代码中使用哪些密钥和证书.
更新
API提供要使用的CA证书而不是默认值.以下代码使用他们的证书,这是我想在本地重现.
var ca = fs.readFileSync('./certificate.pem');
var options = {
host: 'example.com',
path: …Run Code Online (Sandbox Code Playgroud) 我有以下错误Hostname domain.com not verified:不是"javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated"我以前能够连接到不同的主机,在这个主机我遇到问题,如何解决它
javax.net.ssl.SSLPeerUnverifiedException: Hostname domain.com not verified:
certificate: sha1//WQM9QbrKs6DCFa9qN/EIw1ywBw=
DN: CN=*.ipage.com,OU=Domain Control Validated - RapidSSL(R),OU=See www.rapidssl.com/resources/cps (c)14,OU=GT29505539
subjectAltNames: [*.ipage.com, ipage.com]
at com.squareup.okhttp.Connection.connectTls(Connection.java:244)
at com.squareup.okhttp.Connection.connectSocket(Connection.java:199)
at com.squareup.okhttp.Connection.connect(Connection.java:172)
at com.squareup.okhttp.Connection.connectAndSetOwner(Connection.java:367)
at com.squareup.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:128)
at com.squareup.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:328)
at com.squareup.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:245)
at com.squareup.okhttp.Call.getResponse(Call.java:267)
Run Code Online (Sandbox Code Playgroud)
这是我的代码
try {
JSONObject jsonObject = new JSONObject();
jsonObject.accumulate("name", name);
jsonObject.accumulate("password", pass);
jsonObject.accumulate("email", emails);
json = jsonObject.toString();
Log.e("MYAPP", "getjson");
} catch (JSONException e) {
Log.e("MYAPP", "unexpected JSON exception", e);
}
try{
RequestBody formBody = new …Run Code Online (Sandbox Code Playgroud) 我正在创建一个简单的 Android 应用程序,将在封闭的本地网络中使用。在此本地网络中,正在运行 Flask 服务器,该服务器配置为通过 nginx 代理使用自签名证书。服务器的后端应用程序使用自签名证书可以正常工作,我已经使用浏览器和邮递员验证了这一点。(显然,我必须明确要求浏览器信任我的证书)。
几天来,我一直试图在网上找到一些关于如何让我的 Android 应用程序接受我的证书的明确答案,但我尝试过的所有事情都让我走进了死胡同。有时这些解决方案已被弃用,有时又对于这样一件微不足道的事情来说太复杂了。
http请求是使用Retrofit发送的;据我了解,我必须以某种方式配置改造实例的 http 客户端以接受我的证书。
我已经设法使用接受任何证书的客户端,但这不是我想要的。理想情况下,我的证书将添加到官方 CA 默认信任的证书“集”中,以便应用程序也可以向外部资源发送请求。
那么,假设后端应用程序运行在例如 192.168.1.10:443 上,我该如何处理呢?
注意:我已阅读此处给出的说明https://developer.android.com/training/articles/security-config.html#TrustingAdditionalCas 并添加了
android:networkSecurityConfig="@xml/network_security_config"
到我的清单文件,但我收到以下错误:
Hostname 192.168.1.10 not verified: certificate sha256/...../.....
并继续列出证书的信息,如通用名称等。
我正在尝试使用 OkHttp 库将发布请求发送到带有一些 url 参数的 API。在这篇博文之后,到目前为止我有这个代码:
public String okHttpRequest() throws IOException{
OkHttpClient client = new OkHttpClient();
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
HttpUrl.Builder urlBuilder = HttpUrl.parse("myurl").newBuilder();
urlBuilder.addQueryParameter("username","username");
urlBuilder.addQueryParameter("password","7777");
String url = urlBuilder.build().toString();
Request request = new Request.Builder()
.url(url)
.build();
//HERE EXCEPTION IS THROWN
Response response = client.newCall(request).execute();
return response.body().string();
}
Run Code Online (Sandbox Code Playgroud)
例外是:
javax.net.ssl.SSLPeerUnverifiedException: Hostname {domain} not verified: