我试图与具有自签名证书的https服务器通信。
我可以从你的电脑上做这件事。NET应用程序(使用ServicePointManager.ServerCertificateValidationCallback事件)、本机iOs应用程序(使用allowsAnyHTTPSCertificateForHost)或web浏览器(只需声明证书受信任)。
但我无法让它在react本机应用程序中工作(无论是在Android还是在iOS模拟器中)。
我尝试过不同的事情,但仍然没有成功。
我知道这里有一些类似的主题:
在本机应用程序中使用fetch API忽略自签名SSL证书的错误
如果ssl(https)证书无效,React-Native XMLHttpRequest请求将失败
在android上,React-Native无法与ssl一起工作
从基于ssl的服务器获取数据时出现问题
无法使用React-Native进行API调用
但它们要么不包含答案,要么不起作用(而且它们根本不涉及android编程)。搜索其他资源也没有什么成效。
我相信应该有一个简单的方法来使用自签名证书。我错了吗?有人知道吗(iOS和Android)?
我做了以下工作在Android上:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<!-- For React Native Hot-reloading system -->
<!-- If you are running on a device insert your computer IP -->
<domain includeSubdomains="true">localhost</domain>
<domain includeSubdomains="true">your self signed domain</domain>
<trust-anchors>
<certificates src="system" />
<certificates src="user" />
</trust-anchors>
</domain-config>
<base-config cleartextTrafficPermitted="false" />
</network-security-config>
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:networkSecurityConfig="@xml/network_security_config"
... >
...
</application>
</manifest>
我在Android系统中也面临同样的问题。最后我找到了解决这个问题的办法。
import com.facebook.react.modules.network.OkHttpClientFactory;
import com.facebook.react.modules.network.OkHttpClientFactory;
import com.facebook.react.modules.network.OkHttpClientProvider;
import com.facebook.react.modules.network.ReactCookieJarContainer;
import java.security.cert.CertificateException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import okhttp3.CipherSuite;
import okhttp3.ConnectionSpec;
import okhttp3.OkHttpClient;
import okhttp3.TlsVersion;
import static android.content.ContentValues.TAG;
public class CustomClientFactory implements OkHttpClientFactory {
private static final String TAG = "OkHttpClientFactory";
@Override
public OkHttpClient createNewNetworkModuleClient() {
try {
// Create a trust manager that does not validate certificate chains
final TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}
}
};
// Install the all-trusting trust manager
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
// Create an ssl socket factory with our all-trusting manager
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.connectTimeout(0, TimeUnit.MILLISECONDS).readTimeout(0, TimeUnit.MILLISECONDS)
.writeTimeout(0, TimeUnit.MILLISECONDS).cookieJar(new ReactCookieJarContainer());
builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);
builder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
OkHttpClient okHttpClient = builder.build();
return okHttpClient;
} catch (Exception e) {
Log.e(TAG, e.getMessage());
throw new RuntimeException(e);
}
}
}
在我们的Android应用程序main应用程序中。JAVA
@Override
public void onCreate() {
super.onCreate();
SoLoader.init(this, /* native exopackage */ false);
OkHttpClientProvider.setOkHttpClientFactory(new CustomClientFactory()); //add this line.
}
这是我的工作。也许这对大家都有帮助。
免责声明:此解决方案应该是临时的,并记录在案,这样它就不会停留在软件的生产阶段,这仅用于开发。
对于iOS,您所要做的就是打开您的xcodeproject(在RN中的iOS文件夹中),一旦打开该项目,就转到RCTNetwork。在该项目中,导航到RCTHTTPRequestHandler。M
在该文件中,您将看到如下行:
#pragma mark - NSURLSession delegate
在该行之后添加此函数
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler
{
completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]);
}
瞧,您现在可以在没有有效证书的情况下对API进行不安全的调用。
这应该足够了,但如果你仍然有问题,你可能需要去你的项目的信息。plist,左键单击它并选择“打开为…”。。。源代码。
最后再加上
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>NSExceptionDomains</key>
<dict>
<key>localhost</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
<key>subdomain.example.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
所以你的文件看起来像这样
...
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>NSExceptionDomains</key>
<dict>
<key>localhost</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
<key>subdomain.example.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict>
</plist>
对于真正的生产就绪解决方案,https://stackoverflow.com/a/36368360/5943130这种解决办法更好
问题内容: 我已经开始为API编写包装,该包装要求所有请求都通过HTTPS进行。我不想在开发和测试它时向实际的API发出请求,而是希望在本地运行自己的服务器来模拟响应。 我对如何生成创建HTTPS服务器并向其发送请求所需的证书感到困惑。 我的服务器看起来像这样: Pem文件是使用以下命令生成的: 一个请求看起来像这样: 通过此设置,我得到了,所以我认为我需要为该请求添加一个选项。 所以我的问题是我
我已经准备好了用于在我的 AWS ELB 上终止外部 HTTPS 连接。我现在尝试使用带有自签名证书的 HTTPS 来保护 EC2 上的 ELB 和后端 NGINX 服务器之间的连接。我已经按照文档进行操作,但是通过HTTPS访问服务器会导致408 HTTP超时。我似乎无法获得任何调试信息来确定故障所在。 < li >我已经确认安全组允许EC2上的ELB和NGINX之间的连接。 < li >我已经
问题内容: 我对phonegap比较陌生,最近我在Windows apache服务器上使用自签名证书设置了HTTPS / SSL,并尝试发出HTTPS ajax发布请求。在浏览器中运行时,该请求工作正常,但在phonegap中运行时失败。我尝试将android:debuggable设置为false,但这不能解决问题。我也做了一些研究,似乎phonegap确实支持HTTPS ajax请求,所以我对请
我希望建立一个ELB,使用HTTPS与后端服务器通信。我正在尝试使用单个后端服务器进行概念验证,但似乎无法让ELB与服务器通信。我几乎可以肯定这是一个证书问题,因为任何没有SSL的设置都可以完美工作。 我如何设置?我尝试了来自多个答案和博客帖子的各种建议,但没有成功。 我现在所做的是使用以下命令设置自签名证书(来自AWS ELB- 我在签名时尝试了多个域名,我可以使用它们: 这里有我应该使用的域/
问题内容: 我正在尝试获取远程服务器的证书,然后可以将其用于添加到我的密钥库中并在我的Java应用程序中使用。 一位资深开发人员(正在度假:()告诉我可以运行此程序: 为了获得原始证书,我可以将其复制并导出。我收到以下输出: 我也尝试过这个选项 和这个(在debian上运行) 但是得到同样的错误。 此消息源说我可以使用该CApath标志,但似乎无济于事。我尝试了多条路径都无济于事。 请让我知道我要
我使用pyTelegrambotAPI、cherrypy作为Web服务器、更新方法webhook、自签名Certficate,在六个月的工作后,今晚我的机器人停止响应。 使用命令时: https://api.telegram.org/botMYTOKEN/getwebhookinfo结果是 {"ok": true,"结果":{"url":"https://MY. IP. ADRESS/MYTOKE