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

Nat*_*man 11 android openssl android-ndk root-certificate

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

但是,我可以在任何设备的浏览器(股票浏览器,Chrome,Firefox等)中显示安全页面.因此,我只能假设OpenSSL没有找到存储在设备上的根证书.

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

  • Android在哪里存储根证书?
  • 我怎样才能将OpenSSL指向他们?

jww*_*jww 8

Android在哪里存储根证书?

它四处移动.随着冰淇淋三明治(ICS)的出现,使用了三家商店.这三个商店/data/misc/keychain(由Android提供),/data/misc/keychain/cacerts-added(由用户添加的CA)和/data/misc/keychain/cacerts-removed(由用户或更新删除的CA).

在加入ICS之前,他们使用了位于的BouncyCastle商店/system/etc/security/cacerts.bks.它是一个静态存储,无法修改.如果需要更改,则需要更新固件或映像.

有关商店的说明,请参阅ICS信任库实施.它的Nikolay Elenkov的博客,他在讨论系统方面做得很好,而不仅仅是商店的位置.


我怎样才能将OpenSSL指向他们?

你无法真正做到这一点,因为OpenSSL期望和Android呈现的是两种不同的演示/存储格式.OpenSSL期望将PEM格式的信任锚集合在一起.但Android信任商店不是那种格式.

通常你下载的是什么cacert.pem.然后,SSL_CTX_load_verify_locations通过指定cacert.pem作为CAfile参数来加载它们.

即使您cacert.pem从受信任的来源(如Mozilla或cURL)下载,您仍应通过它并确保您对信任锚的集合感到满意.包中有155个潜在的信任锚:

$ cat cacert.pem | grep BEGIN | wc -l
     155
Run Code Online (Sandbox Code Playgroud)

但就像我在评论中所说的那样,它隐含地使用浏览器安全模型,并且它在许多情况下并不是一种特别好的方法.


在尝试与知名主机(例如https://google.com)建立HTTPS连接时,我始终收到错误"SSL证书无效".

要回答这个问题,只是使用谷歌互联网机构GeoTrust的全球CASSL_CTX_load_verify_locations.最好使用Google Internet Authority,因为它限制了网络广播.

Google互联网管理局:

-----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-----
Run Code Online (Sandbox Code Playgroud)

GeoTrust Global 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-----
Run Code Online (Sandbox Code Playgroud)

在理想的世界中,您运行私有PKI,并且您只信任您的PKI根来验证站点和服务.你不赋予信任一个公共CA来证明任何东西,因为他们不作任何保证给依赖方.从本质上讲,公共CA告诉您他们的warez不好,即使是他们将它们出售给网站的目的.

在下一个最好的世界中,您只使用认证该站点的公共CA. 这意味着您使用Google Internet AuthorityGeoTrust Global CA来认证Google资产; 而不是,Diginotar说.

还有其他不太明显的问题.在谷歌的互联网管理局是一个不受约束的从属CA的GeoTrust的认证.Google可以为任何网站颁发证书,而不仅仅是Google产品.通常,这是由RA捕获的,RA实际上是一个独立的审计员,在发布之前验证对CA的签名请求.但在此模型中,发出请求的组织(Google)与验证请求的组织(Google)以及颁发证书的组织(Google)相同.浏览器,CA和PKI是唯一我知道独立审计员被完全删除作为检查和平衡的实例,因为它太不方便了.

如果你认为一个下属不会做这样的事情,那你就会被遗忘.CNICC刚从一些浏览器信任商店中删除,因为其中一个无约束的下属被捕获为未经授权的站点和服务颁发证书.

浏览器安全模型真正失效的地方是错误的CA认证站点的能力.它包括对用户的成功网络钓鱼尝试.也就是说,浏览器很乐意允许拦截连接,因为用户被钓鱼了.

如果你认为即将推出的公钥密码管理会有所帮助,那么你就会感到很遗憾.虽然他们几乎没有提到覆盖,但攻击者可以打破一个已知的良好的pinset.更糟糕的是,报告功能对于带有MUST NOT报告的损坏的pinset被禁用,因此浏览器在掩盖中是同谋的.

有关该主题的更多阅读材料.首先,请尝试Peter Gutmann的工程安全和AudunJøsang 在互联网上Trust Extortion .