TrustKit-Android, Android的简单SSL固定验证和报告

分享于 

8分钟阅读

GitHub

  繁體 雙語
Easy SSL pinning validation and reporting for Android.
  • 源代码名称:TrustKit-Android
  • 源代码网址:http://www.github.com/datatheorem/TrustKit-Android
  • TrustKit-Android源代码文档
  • TrustKit-Android源代码下载
  • Git URL:
    git://www.github.com/datatheorem/TrustKit-Android.git
    Git Clone代码到本地:
    git clone http://www.github.com/datatheorem/TrustKit-Android
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/datatheorem/TrustKit-Android
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    TrustKit Android

    Build StatusAPIVersionMIT License

    TrustKit 是一个开源库,它使得部署 SSL public 密钥固定和报告在任何 Android 应用 中都很容易。

    如果你需要在你的iOS应用程序中安装/报告 SSL。 我们还为iOS和 macOS 在 https://github.com/datatheorem/TrustKit 发布了 TrustKit。

    概述

    通过两种方式,TrustKit Android通过扩展 Android网络安全配置插件来工作:

    • 它支持将网络安全配置的<pin-set> ( 用于SSL固定) 和 <debug-overrides> 功能支持到早期版本的Android,从而支持API级别 17. 这允许以前的Android版本的应用程序以以后证明的方式实现SSL锁定。
    • 它增加了在特定连接失败时发送验证报告的能力。 报表具有与 HTTP public 密钥插针TrustKit iOS的报表uri功能类似的格式。

    为了提高兼容性,TrustKit还将在API级别 15和 16上运行,但它的功能将被禁用。

    启动

    示例用法

    将TrustKit添加为依赖项

    将TrustKit添加到项目 build.gradle的:

    compile 'com.datatheorem.android.trustkit:trustkit:<last_version>'

    配置钉住策略

    在应用程序中部署SSL锁定需要使用固定策略( 域。引脚和其他设置) 初始化 TrustKit。 策略被封装在官方 Android网络安全配置 例如:

    <!-- res/xml/network_security_config.xml --><?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
     <!-- Pin the domain www.datatheorem.com --><!-- Official Android N API --> <domain-config>
     <domain>www.datatheorem.com</domain>
     <pin-set>
     <pindigest="SHA-256">k3XnEYQCK79AtL9GYnT/nyhsabas03V+bhRQYHQbpXU=</pin>
     <pindigest="SHA-256">2kOi4HdYYsvTR1sTIR7RHwlf2SescTrpza9ZrWy7poQ=</pin>
     </pin-set>
     <!-- TrustKit Android API --><!-- Do not enforce pinning validation --> <trustkit-configenforcePinning="false">
     <!-- Add a reporting URL for pin validation reports --> <report-uri>http://report.datatheorem.com/log_report</report-uri>
     </trustkit-config>
     </domain-config>
     <debug-overrides>
     <trust-anchors>
     <!-- For debugging purposes, add a debug CA and override pins --> <certificatesoverridePins="true"src="@raw/debugca"/>
     </trust-anchors>
     </debug-overrides>
    </network-security-config>

    使用钉住策略初始化 TrustKit

    在应用程序的清单应该指定XML策略的路径,以使它的成为应用程序网络安全配置插件的,在 Android N 上是:

    
    <?xml version="1.0" encoding="utf-8"?>
    
    
    <manifest.. .> 
    
    
     <application android:networkSecurityConfig="@xml/network_security_config"
    
    
    . . .> 
    
    
    . . .
    
    
     </application>
    
    
    </manifest>
    
    
    
    
    

    然后,应使用相同的路径初始化 TrustKit:

    @Overrideprotectedvoid onCreate(Bundle savedInstanceState) {
     super.OnCreate(savedInstanceState);
     // Using the default path - res/xml/network_security_config.xmlTrustKit.initializeWithNetworkSecurityConfiguration(this);
     // OR using a custom resource (TrustKit can't be initialized twice)TrustKit.initializeWithNetworkSecurityConfiguration(this, R.xml.my_custom_network_security_config);
     URL url =newURL("https://www.datatheorem.com");
     String serverHostname = url.getHost();
     // HttpsUrlConnectionHttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
     connection.setSSLSocketFactory(TrustKit.getInstance().getSSLSocketFactory(serverHostname));
     // OkHttp 2.xOkHttpClient client =newOkHttpClient()
    . setSSLSocketFactory(TrustKit.getInstance().getSSLSocketFactory(serverHostname));
     // OkHttp 3.0.x, 3.1.x and 3.2.xOkHttpClient client =newOkHttpClient.Builder()
    . sslSocketFactory(TrustKit.getInstance().getSSLSocketFactory(serverHostname))
     // OkHttp 3.3.x and higherOkHttpClient client =newOkHttpClient().newBuilder()
    . sslSocketFactory(TrustKit.getInstance().getSSLSocketFactory(serverHostname),
     TrustKit.getInstance().getTrustManager(serverHostname))
    . build();
    }

    一旦TrustKit已经初始化并且设置了连接的SSLSocketFactory,它就会在启动HTTPS连接时验证服务器链的证书。 如果已经配置报表 URI,则每当发生pin验证失败时,应用程序也将向指定的URI发送报告。

    限制

    在 Android N 设备上,TrustKit使用了绑定操作系统的实现,并且不受下列限制的影响。

    在 Android M 和较早的设备上,TrustKit提供了自己的固定实现,它主要与安卓行为兼容。 但是,为了使代码库尽可能简单,它有以下限制:

    • 固定策略将只应用于配置为使用trustkit提供的SSLSocketFactory 或者 X509TrustManager的连接。
    • TrustKit提供的SSLSocketFactory 或者 X509TrustManager 只能用于到传递给 getTrustManager()getSSLSocketFactory() 方法的域的连接。 因此,如果重定向到其他域,则新域将失败SSL验证,连接将失败。 实际上,这不应该是问题,因为在这种情况下,不应该在这个场景中使用in的---重定向。
    • 只有在全局 <debug-overrides> 标记中使用 <trust-anchors> 设置时才会应用该设置。 因此,无法设置特定域的自定义信任锚。
    • <trust-anchors> 标记中,只有 <certificate> 标记指向原始证书文件是支持( 将忽略 src 属性的user 或者 system 值)。

    许可证

    TrustKit Android是在MIT许可下发布的。 详细信息请参阅许可证。


    rep  REPO  Report  报表  SSL  Pinning