Livejournal
Log in
Post
Friends
My journal
kosenko_danila
Сами мы не умные
Dec 14, 2020 12:52
Есть приложение на адроид, написано на java. Есть сервер, с которым оно соединяется по https.
Соединяется вот таким кодом
(
код на java
)
линукс
,
памятка
,
программирование
,
андроид
Leave a comment
Back to all threads
Re: code
kosenko_danila
December 14 2020, 13:31:19 UTC
Я умею пользоваться гуглом и яндексом.
Первоначально код функции выглядел так:
public String getStr(String link){
String resultJson = "";
try{
URL url = new URL(link);
HttpsURLConnection con = (HttpsURLConnection)url.openConnection();
con.setRequestMethod( "GET" );
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null,null,null);
/*sslContext.init(null, new TrustManager[] {
new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) {}
public void checkServerTrusted(X509Certificate[] chain, String authType) {}
public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[]{}; }
}
}, null);*/
/* TrustManager[] trustManagers = new TrustManager[] {
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException { }
public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException
{}
}
};*/
HostnameVerifier hostnameVerifier = new HostnameVerifier() {
public boolean verify(String s, SSLSession sslSession) {
return s.equals(sslSession.getPeerHost());
}
};
con.setHostnameVerifier(hostnameVerifier);
// sslContext.init(null, trustManagers, null);
con.setSSLSocketFactory(sslContext.getSocketFactory());
int responseCode = con.getResponseCode();
InputStream inputStream;
if (responseCode == HttpsURLConnection.HTTP_OK) {
inputStream = con.getInputStream();
} else {
inputStream = con.getErrorStream();
}
// Process the response
StringBuffer buffer = new StringBuffer();
BufferedReader reader;
String line = null;
reader = new BufferedReader( new InputStreamReader( inputStream ) );
while( ( line = reader.readLine() ) != null )
{
buffer.append(line);
//alert( line );
}
resultJson = buffer.toString();
inputStream.close();
}catch(Exception e){
//alert(e.toString());
Log.e("+++++++++++++++", e.toString());
return "-1";
}
return resultJson;
}
Я просто скрыл закомментированную часть. Когда эта часть была доступна, гугл.маркет не давал залить к себе, ругаясь, что X509TrustManager небезопасен.
Эти ссылки я читал. Но так и не понял, что именно надо сделать на сервере.
Reply
RE: Re: code
craftwr
December 14 2020, 14:42:49 UTC
Не проходит проверка промежуточных сертификатов на сервере, грубо говоря, надо создать цепочку доверенных сертификатов.
Reply
Re: code
kosenko_danila
December 14 2020, 14:47:42 UTC
Тут выше человек вроде пытается помочь, но моих знаний, увы, мало для понимания.
Reply
Re: code
craftwr
December 14 2020, 14:58:10 UTC
Это не твоя проблема, скажи сисдадминам пусть создадут цепочку сертификатов по линку там все есть.
Reply
Re: code
kosenko_danila
December 14 2020, 14:59:55 UTC
https://kosenko-danila.livejournal.com/292496.html?thread=3649936#t3649936
>однако, сайт цепочку отдаёт, значит дело не в этом.
Reply
Re: code
kosenko_danila
December 15 2020, 10:52:29 UTC
Обновил пост.
Reply
RE: Re: code
craftwr
December 15 2020, 10:53:59 UTC
Ну что и следовало ожидать.
Reply
Back to all threads
Leave a comment
Up
Первоначально код функции выглядел так:
public String getStr(String link){
String resultJson = "";
try{
URL url = new URL(link);
HttpsURLConnection con = (HttpsURLConnection)url.openConnection();
con.setRequestMethod( "GET" );
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null,null,null);
/*sslContext.init(null, new TrustManager[] {
new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) {}
public void checkServerTrusted(X509Certificate[] chain, String authType) {}
public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[]{}; }
}
}, null);*/
/* TrustManager[] trustManagers = new TrustManager[] {
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException { }
public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException
{}
}
};*/
HostnameVerifier hostnameVerifier = new HostnameVerifier() {
public boolean verify(String s, SSLSession sslSession) {
return s.equals(sslSession.getPeerHost());
}
};
con.setHostnameVerifier(hostnameVerifier);
// sslContext.init(null, trustManagers, null);
con.setSSLSocketFactory(sslContext.getSocketFactory());
int responseCode = con.getResponseCode();
InputStream inputStream;
if (responseCode == HttpsURLConnection.HTTP_OK) {
inputStream = con.getInputStream();
} else {
inputStream = con.getErrorStream();
}
// Process the response
StringBuffer buffer = new StringBuffer();
BufferedReader reader;
String line = null;
reader = new BufferedReader( new InputStreamReader( inputStream ) );
while( ( line = reader.readLine() ) != null )
{
buffer.append(line);
//alert( line );
}
resultJson = buffer.toString();
inputStream.close();
}catch(Exception e){
//alert(e.toString());
Log.e("+++++++++++++++", e.toString());
return "-1";
}
return resultJson;
}
Я просто скрыл закомментированную часть. Когда эта часть была доступна, гугл.маркет не давал залить к себе, ругаясь, что X509TrustManager небезопасен.
Эти ссылки я читал. Но так и не понял, что именно надо сделать на сервере.
Reply
Reply
Reply
Reply
>однако, сайт цепочку отдаёт, значит дело не в этом.
Reply
Reply
Reply
Leave a comment