证书信任和用户认证

.net 访问证书认证信任

ServicePointManager.ServerCertificateValidationCallback = (a, b, c, d) => true;

 

 

 

Windows authentication validation

using (var client = new HttpClient(url))
{

client.TransportSettings.Credentials = new NetworkCredential("username", "password", "domain");

...

}

转载于:https://www.cnblogs.com/maoya/archive/2012/02/28/2371805.html

### 如何让Android应用信任用户导入的自定义SSL/TLS证书 为了使Android应用程序能够信任用户导入的自定义SSL/TLS证书,可以通过以下方式实现: #### 1. 使用 `TrustManager` 自定义信任管理器 通过创建一个自定义的 `TrustManager` 实现类来处理用户导入的证书。该类需要继承 `X509TrustManager` 接口并重写其方法以验证服务器返回的证书是否匹配用户导入的证书。 ```java import java.security.cert.CertificateException; import java.security.cert.X509Certificate; public class CustomTrustManager implements javax.net.ssl.X509TrustManager { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {} @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { // 验证服务器证书是否与用户导入的证书一致 try { validateUserProvidedCert(chain); } catch (Exception e) { throw new CertificateException(e.getMessage()); } } private void validateUserProvidedCert(X509Certificate[] chain) throws Exception { X509Certificate serverCert = chain[0]; // 假设 userCert 是用户导入的证书对象 X509Certificate userCert = loadUserImportedCert(); if (!serverCert.equals(userCert)) { throw new Exception("The server's certificate does not match the imported one."); } } private X509Certificate loadUserImportedCert() throws Exception { // 加载用户导入的证书逻辑 return null; // 返回用户导入的证书实例 } @Override public X509Certificate[] getAcceptedIssuers() { return null; } } ``` 上述代码实现了对服务器返回证书的校验功能[^1]。 --- #### 2.用户导入的证书存储到 `KeyStore` 将用户的自定义证书保存至 `KeyStore` 中,并将其配置给 `SSLSocketFactory` `OkHttpClient`。 以下是完整的流程示例: ```java import android.content.Context; import org.apache.commons.io.IOUtils; import javax.net.ssl.*; import java.io.InputStream; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; public class SslUtil { public static OkHttpClient createSslEnabledClient(Context context) throws Exception { KeyStore keyStore = loadCertsFromAssets(context); SSLContext sslContext = SSLContext.getInstance("TLS"); TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(keyStore); sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom()); SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); OkHttpClient client = new OkHttpClient.Builder() .sslSocketFactory(sslSocketFactory, (X509TrustManager) trustManagerFactory.getTrustManagers()[0]) .build(); return client; } private static KeyStore loadCertsFromAssets(Context context) throws Exception { KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); keyStore.load(null, null); // 初始化空的KeyStore InputStream certInputStream = context.getResources().openRawResource(R.raw.user_certificate); // 用户导入的证书资源路径 CertificateFactory cf = CertificateFactory.getInstance("X.509"); X509Certificate ca = (X509Certificate) cf.generateCertificate(certInputStream); IOUtils.closeQuietly(certInputStream); keyStore.setCertificateEntry("ca", ca); // 设置别名为"ca" return keyStore; } } ``` 在此过程中,`loadCertsFromAssets()` 方法负责加载来自 assets 文件夹中的用户证书[^4]。 --- #### 3. 双向认证场景下的客户端证书加载 如果涉及 TLS 双向认证,则还需要加载客户端私钥证书。这通常使用 BKS/JKS 格式的密钥库完成。 ```java private static SSLSocketFactory buildTlsMutualAuthSocketFactory(String keystorePath, char[] password) throws Exception { KeyStore keyStore = KeyStore.getInstance("BKS"); // 或 JKS InputStream inputStream = new FileInputStream(keystorePath); keyStore.load(inputStream, password); KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); kmf.init(keyStore, password); SSLContext sc = SSLContext.getInstance("TLS"); sc.init(kmf.getKeyManagers(), null, new SecureRandom()); return sc.getSocketFactory(); } ``` 这段代码展示了如何初始化带有客户端证书的 `SSLSocketFactory`,适用于双向认证需求[^3]。 --- #### 注意事项 - **安全性**:绕过 SSL Pinning 不应被推荐用于生产环境,因为它可能降低系统的安全防护能力[^2]。 - **动态更新**:对于频繁变化的用户证书,建议设计一套机制定期同步最新版本。 - **错误处理**:务必捕获异常情况并向用户提供友好的反馈信息。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值