android - 如何将 OpenSSL 指向 Android 设备上的根证书?

标签 android android-ndk openssl root-certificate

我已经设法为 ARMv6 交叉编译 OpenSSL 以用于 the Android NDK并让它在我的应用程序中运行。但是,当尝试与知名主机(例如 https://google.com)建立 HTTPS 连接时,我总是收到错误消息“SSL 证书无效”。

但是,在我设备的任何浏览器(常用浏览器、Chrome、Firefox 等)中显示安全页面都没有困难。因此我只能假设 OpenSSL 没有找到存储在设备上的根证书。

然后我的问题分解为两个非常相关的子问题:

  • Android 将根证书存储在设备的什么位置?
  • 我如何将 OpenSSL 指向他们?
  • 最佳答案

    Where does Android store the root certificates on the device?


    它四处移动。随着 Ice Cream Sandwich (ICS) 的出现,使用了三个商店。三家店是/data/misc/keychain (由安卓提供),/data/misc/keychain/cacerts-added (用户添加的 CA)和 /data/misc/keychain/cacerts-removed (用户或更新删除的 CA)。
    在 ICS 之前,他们使用位于 /system/etc/security/cacerts.bks 的 BouncyCaSTLe 商店。 .这是一个静态存储,无法修改。如果需要更改,则需要更新固件或镜像。
    有关商店的说明,请参阅 ICS Trust Store Implementation .这是 Nikolay Elenkov 的博客,他在讨论系统方面做得很好,而不仅仅是商店所在的位置。

    How can I point OpenSSL to them?


    您不能真正做到这一点,因为 OpenSSL 期望和 Android 呈现的是两种不同的呈现/存储格式。 OpenSSL 期望将一组 PEM 格式的信任 anchor 连接在一起。但 Android 信任库不是这种格式。
    通常发生的情况是您下载 cacert.pem .然后,调用 SSL_CTX_load_verify_locations 加载它们。通过指定 cacert.pem作为 CAfile争论。
    即使您下载 cacert.pem来自受信任的来源,例如 Mozilla 或 cURL,您仍然应该仔细检查并确保您对信任 anchor 的集合感到满意。包中有 155 个潜在的信任 anchor :
    $ cat cacert.pem | grep BEGIN | wc -l
         155
    
    但就像我在评论中所说的那样,它隐含地使用了浏览器安全模型,并且在许多情况下它并不是一个特别好的做事方式。

    when attempting to establish an HTTPS connection to a well-known host (such as https://google.com), I always receive the error "The SSL certificate is invalid."


    要回答这个问题,只需使用 Google Internet AuthorityGeoTrust Global CA SSL_CTX_load_verify_locations .最好使用 Google Internet Authority,因为它限制了网络转换。
    谷歌互联网管理局 :
    -----BEGIN CERTIFICATE-----
    MIID8DCCAtigAwIBAgIDAjp2MA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
    MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
    YWwgQ0EwHhcNMTMwNDA1MTUxNTU1WhcNMTYxMjMxMjM1OTU5WjBJMQswCQYDVQQG
    EwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzElMCMGA1UEAxMcR29vZ2xlIEludGVy
    bmV0IEF1dGhvcml0eSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
    AJwqBHdc2FCROgajguDYUEi8iT/xGXAaiEZ+4I/F8YnOIe5a/mENtzJEiaB0C1NP
    VaTOgmKV7utZX8bhBYASxF6UP7xbSDj0U/ck5vuR6RXEz/RTDfRK/J9U3n2+oGtv
    h8DQUB8oMANA2ghzUWx//zo8pzcGjr1LEQTrfSTe5vn8MXH7lNVg8y5Kr0LSy+rE
    ahqyzFPdFUuLH8gZYR/Nnag+YyuENWllhMgZxUYi+FOVvuOAShDGKuy6lyARxzmZ
    EASg8GF6lSWMTlJ14rbtCMoU/M4iarNOz0YDl5cDfsCx3nuvRTPPuj5xt970JSXC
    DTWJnZ37DhF5iR43xa+OcmkCAwEAAaOB5zCB5DAfBgNVHSMEGDAWgBTAephojYn7
    qwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUSt0GFhu89mi1dvWBtrtiGrpagS8wEgYD
    VR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwNQYDVR0fBC4wLDAqoCig
    JoYkaHR0cDovL2cuc3ltY2IuY29tL2NybHMvZ3RnbG9iYWwuY3JsMC4GCCsGAQUF
    BwEBBCIwIDAeBggrBgEFBQcwAYYSaHR0cDovL2cuc3ltY2QuY29tMBcGA1UdIAQQ
    MA4wDAYKKwYBBAHWeQIFATANBgkqhkiG9w0BAQUFAAOCAQEAJ4zP6cc7vsBv6JaE
    +5xcXZDkd9uLMmCbZdiFJrW6nx7eZE4fxsggWwmfq6ngCTRFomUlNz1/Wm8gzPn6
    8R2PEAwCOsTJAXaWvpv5Fdg50cUDR3a4iowx1mDV5I/b+jzG1Zgo+ByPF5E0y8tS
    etH7OiDk4Yax2BgPvtaHZI3FCiVCUe+yOLjgHdDh/Ob0r0a678C/xbQF9ZR1DP6i
    vgK66oZb+TWzZvXFjYWhGiN3GhkXVBNgnwvhtJwoKvmuAjRtJZOcgqgXe/GFsNMP
    WOH7sf6coaPo/ck/9Ndx3L2MpBngISMjVROPpBYCCX65r+7bU2S9cS+5Oc4wt7S8
    VOBHBw==
    -----END CERTIFICATE-----
    
    GeoTrust 全局 CA :
    -----BEGIN CERTIFICATE-----
    MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
    MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
    YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
    EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
    R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
    9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
    fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
    iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
    1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
    bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
    MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
    ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
    uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
    Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
    tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
    PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
    hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
    5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
    -----END CERTIFICATE-----
    

    在理想的世界中,您运行一个私有(private) PKI,并且您只信任您的 PKI 的根来认证站点和服务。您不授予信任公共(public) CA 来证明任何内容,因为他们不对依赖方做出任何保证。从本质上讲,公共(public) CA 会告诉您他们的warez 并不好,即使是出于将它们出售给网站的目的。
    在次优世界中,您只使用认证该站点的公共(public) CA。这意味着您使用 Google Internet AuthorityGeoTrust Global CA证明 Google 属性(property);而不是,比如说Diginotar .
    还有其他不太明显的问题。 Google Internet Authority不受约束 GeoTrust 认证的下属 CA。 Google 可以为任何网站颁发证书,而不仅仅是 Google Assets 。通常,这会被 RA 捕获,它实际上是一个独立的审计员,在签发之前验证对 CA 的签名请求。但在此模型中,提出请求的组织 (Google) 与验证请求的组织 (Google) 和颁发证书的组织 (Google) 相同。浏览器、CA 和 PKI 是我知道的唯一实例,独立审计员作为检查和平衡被完全删除 because it was too inconvenient .
    如果你认为下属不会这样做,那你就大错特错了。 CNICC was just removed from a few browser trust stores因为它的一个不受约束的下属被发现为未经授权的站点和服务颁发证书。
    浏览器安全模型真的故障是错误的 CA 认证站点的能力。它包括对用户的成功网络钓鱼尝试。也就是说,浏览器会很高兴地允许连接被拦截,因为用户被钓鱼。
    如果您认为即将推出的Public Key Pinning with Overrides会有所帮助,那么你会很遗憾地错了。尽管他们几乎没有提到覆盖,但攻击者可以破坏已知的良好 pinset。更糟糕的是,报告功能被禁用了一个带有 的损坏的针组。不得报告 ,所以浏览器是隐瞒的同谋。
    关于这个主题有更多的阅读 Material 。首先,试试 Peter Gutmann 的 Engineering Security和 Audun Jøsang 的 Trust Extortion on the Internet .

    关于android - 如何将 OpenSSL 指向 Android 设备上的根证书?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15375577/

    相关文章:

    java - 有没有办法检索以动态方式创建的控件(线性布局)的信息?

    android - 无法在 gradle 上解析符号 MavenDeployment

    java - 让 Android 选择下一个 SQLITE _ID

    android - TCP套接字从PC传输数据到android设备(Android NDK)

    android - arm-linux-androideabi编译器使用方法

    ssl - 使用现有私钥创建 CSR

    android - 支持库 23.2.0 导致应用程序崩溃

    Ruby 从预先存在的 key 字符串创建密码 key

    c++11 - 在 OpenSSL v1.1.0 中使用 unique_ptr<SSL>

    c++ - 在 NDK 的稳定 API 之外使用原生 Android 系统库