【问题标题】:How to trust all my self-signed certificates in my app如何信任我的应用程序中的所有自签名证书
【发布时间】:2020-02-14 00:39:05
【问题描述】:

我有一个与我的主机服务器通信的 Android 应用。应用程序和服务器通过 SSL 进行通信。每年,我都必须更新主机服务器中的(自签名)证书。每次该证书到期时,我都必须通过创建自己的 TrustManager 并直接信任新证书来相应地更新我的 Android 应用程序。这是完美的工作。

问题是,我不想在每次证书过期时都修改我的 Android 应用。所以问题是,我如何信任我颁发的所有自签名证书?同样,只有我的自签名证书。

这些是限制:

  1. 只能使用自签名证书
  2. 我只能创建有效期最长为 12 个月的新证书

这就是我生成证书的方式:

openssl req -newkey rsa:4096 \
        -x509 \
        -sha256 \
        -days 365 \
        -nodes \
        -out selfSignedCert.crt \
        -keyout newPrivate.key

非常感谢您的帮助。

【问题讨论】:

    标签: android ssl ssl-certificate truststore


    【解决方案1】:

    创建有效期为 10 年的 CA 证书。使用 CA 证书签署服务器证书。服务器证书的有效期应为 1 年或更短。 在您的应用程序中包含 CA 证书并将其添加到您的自定义 TrustManager 中。现在您只需在 CA 证书到期时每 10 年发布一次新应用程序。您的 TrustManager 应该接受所有由您的 CA 证书签名的证书。

    详细步骤: 1. 创建 CA 密钥

        sudo openssl genrsa -out  CA/rocketCA.key 1024
    
    1. 创建 CA 证书请求
        openssl req -new -key CA/rocketCA.key -out CA/rocketCA.csr
    
    1. 自签名 CA 证书
        sudo openssl x509 -req -days 3650 -in CA/rocketCA.csr -out CA/rocketCA.crt -signkey CA/rocketCA.key
    
    1. 验证 CA 证书内容
        openssl x509 -in CA/hitenCA.crt -text
    
    1. 使用完全限定的 DNS 名称(例如 Rocket.example.com)或使用 IPAddress 创建 Web 服务器私钥。当系统提示您输入密码时,输入您能记住的密码。
        sudo openssl genrsa -des3 -out server/keys/rocket.example.com.key 1024
    
    1. 使用与私钥相同的完全限定 DNS 名称/IP 创建 Web 服务器证书请求
        openssl req -new -key server/keys/rocket.example.com.key -out server/requests/rocket.example.com.csr
    
    1. 使用 CA 密钥签署 Web 服务器证书
        sudo openssl ca -days 3650 -in server/requests/rocket.example.com.csr -cert CA/rocketCA.crt -keyfile CA/rocketCA.key -out server/certificates/rocket.example.com.crt
    
    1. 要验证 Web 服务器证书内容,请使用以下命令
        openssl x509 -in server/certificates/rocket.example.com.crt -text
    

    要查找的关键值是:

    Subject CN=rocket.example.com
    Issuer CN=rocketCA
    

    详细步骤参考:(不需要Mutual Auth部分)

    http://www.cafesoft.com/products/cams/ps/docs32/admin/ConfiguringApache2ForSSLTLSMutualAuthentication.html

    【讨论】:

    • 谢谢。我会尽快看看。顺便说一句,StackOverflow 不鼓励仅链接的答案,因为链接在几个月或几年后变得无效。您可能需要复制答案中的详细步骤并提供链接作为参考。
    • 好的,我会这样做的。
    【解决方案2】:

    首先,不清楚为什么您有一年的限制,以及您究竟如何颁发新证书,以及为什么您只能使用自签名证书。但是,仍然适用于更新证书的固定/信任的常用方法是固定证书的公钥,而不是证书本身。然后确保更新证书时密钥保持不变。

    【讨论】:

    • 谢谢。我更新了我的问题以包括我如何生成证书。但是,检查openssl 文档,它似乎没有提供有关如何包含/使用公钥来签署新证书的信息。
    • @user1506104:我认为您需要更深入地研究文档。您明确指定的 -newkey 选项指示 openssl 创建一个新密钥。要指定现有的,请使用-key 选项。
    • 好的,我阅读了文档。你是对的,我应该使用-key。所以我使用openssl genrsa -out keypair.pem 4096 创建了一个密钥对。我使用keypair.pem 作为-key 选项的参数。
    • 在我试图从我的keypair.pem 中提取公钥之前,我几乎得到了我想要的答案。从这个stackoverflow.com/questions/44474516/… 看起来公钥和证书是一回事?我不是加密人,所以我迷路了。如果是这种情况,我可以使用公钥/证书文件并加载到我的 APK 中,我的问题就解决了。
    • @user1506104:公钥包含在证书中,但公钥与证书不同。
    猜你喜欢
    • 1970-01-01
    • 2014-06-04
    • 2016-12-23
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多