使用keytool生成自签证书

使用keytool生成自签证书

生成密钥库与自签名证书

keytool -genkeypair -alias mydomain -keyalg RSA -keysize 2048 -validity 365 -keystore mydomain.keystore

参数解释:

  • -genkeypair:生成密钥对。
  • -alias:证书别名,通常使用域名。
  • -keyalg:密钥算法,这里使用 RSA。
  • -keysize:密钥大小,2048位。
  • -validity:证书有效期,这里是365天。
  • -keystore:指定密钥库的名称。
  • -dname:指定证书拥有者的信息。
  • -storepass-keypass:分别指定密钥库和密钥的密码。

导出证书

keytool -exportcert -alias mydomain -keystore mydomain.keystore -file mydomain.crt

参数解释:

  • -exportcert:导出证书
  • -file:指定导出的证书的文件名

转换格式

PEM

Nginx 默认不支持直接使用 Java 的密钥库格式,需要将私钥转换为 PEM 格式

keytool -importkeystore -srckeystore mydomain.keystore -destkeystore mydomain.p12 -deststoretype PKCS12
openssl pkcs12 -in mydomain.p12 -nocerts -nodes -out mydomain.key

mydomain.key 是Nginx可以直接使用的PEM格式的私钥文件

BKS

Android 默认使用 Bouncy Castle 的 BKS 格式作为其密钥库格式

需要使用Bouncy Castle 提供的 bctls-jdk15on 库进行转换

# 将.crt转换为.pem
openssl x509 -in mydomain.crt -out mydomain.pem -outform PEM

# 使用keytool创建bks文件
keytool -importcert -alias mydomain -file mydomain.pem -keystore mydomain.bks -storetype BKS -providerclass org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath path/to/bcprov-jdk15on-<version>.jar -storepass mypassword

将生成的 mydomain.bks 文件复制到 Android 项目的 assets 文件夹中即可使用

    public static SSLSocketFactory getSocketFactory(Context context) throws Exception {
        // 读取 BKS 文件
        InputStream inputStream = context.getAssets().open("mydomain.bks");
        KeyStore keyStore = KeyStore.getInstance("BKS");
        keyStore.load(inputStream, "mypassword".toCharArray());

        // 使用 KeyStore 创建一个 TrustManager
        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        trustManagerFactory.init(keyStore);
        
        // 使用 TrustManager 初始化 SSLContext
        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, trustManagerFactory.getTrustManagers(), null);
        
        return sslContext.getSocketFactory();
    }

    public static void doHttpsRequest(String urlString) throws Exception {
        URL url = new URL(urlString);
        HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
        
        // 设置自定义的 SSLSocketFactory
        urlConnection.setSSLSocketFactory(getSocketFactory(context));
        
        // 其他配置...
        
        // 发起请求
        urlConnection.connect();
        
        // 读取响应...
        
        urlConnection.disconnect();
    }
  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值