【问题标题】:Storing private key and certificate (.pem) on android/iOS Keystore C#在 android/iOS Keystore C# 上存储私钥和证书 (.pem)
【发布时间】:2020-07-09 10:47:17
【问题描述】:

我想在客户端设备(运行 Xamarin.Forms 的 iOS 或 Android 手机)上创建一个非对称密钥对,并创建一个证书签名请求以发送到运行我的数据库的 linux 服务器上的 ASP.NET Core Restful API .为此,我在 API 上使用 Portable Bouncy Castle 和 net core 版本。

发送的 CSR 将由自定义 CA 通过 WebAPI 签名并添加到我的数据库上的证书表中,这样当设备发送 GET 请求时,它可以检索它(一次性激活密钥用于身份验证csr的帖子以及签名证书的检索)。

使用this,我创建了一个私钥和 CSR 请求,并将 csr 转换为可以发布到 API 的字符串。当 API 收到此信息时,它会将其放入脚本访问的文本文件中,以使用 CA 证书和 CA 密钥对其进行签名,从而创建一个 client-cert.pem 文件。这将被读取为文本并存储在数据库中,以便设备可以检索它。

在此之后,我想将证书和私钥存储在设备的密钥库中,但是由于我使用 Bouncy Castle 创建密钥对,它的类型为 AsymmetricCipherKeyPair。

我将如何将这些项目存储在密钥库中,以便在连接到数据库时可以访问它以对客户端进行身份验证?我目前不确定 Xamarin.Forms 如何处理密钥库以及如何在其中存储密钥/证书。

【问题讨论】:

    标签: c# xamarin keychain client-certificates android-keystore


    【解决方案1】:

    如果您能找到将 AsymmetricCipherKeyPair 转换为字符串的方法,您可以使用 Xamarin.Essentials: Secure Storage 将这些密钥存储在 KeyStore 中:

    将给定密钥的值保存在安全存储中:

    try
    {
      await SecureStorage.SetAsync("oauth_token", "secret-oauth-token-value");
    }
    catch (Exception ex)
    {
      // Possible that device doesn't support secure storage on device.
    }
    

    从安全存储中检索值:

    try
    {
      var oauthToken = await SecureStorage.GetAsync("oauth_token");
    }
    catch (Exception ex)
    {
      // Possible that device doesn't support secure storage on device.
    }
    

    参考:AsymmetricCipherKeyPair/bouncy-castle-rsa-transforming-keys-into-a-string-format

    【讨论】:

    • 我的设备将在 CipherKeyPair 以及客户端 certificate.pem 中拥有私钥、公钥,但作为字符串。我假设我不需要存储公钥,因为客户端证书包含它,所以只需要私钥和证书。使用 SetAsync 方法,我是否使用客户端证书作为密钥和私钥(除了应用程序之外任何人都不应访问的密钥)作为值。然后我将如何处理证书以确保有人无法通过解密存储的值来访问该私钥?或者这个值是否存储在设备用户无法访问的地方。
    • 是的,存储在密钥库中的值不能被用户访问。只有应用程序可以通过代码访问该值。
    • @nevermore 您是否有以下语句的来源:“用户无法访问存储在密钥库中的值”?
    猜你喜欢
    • 2016-02-19
    • 2018-11-10
    • 2020-10-23
    • 1970-01-01
    • 2020-09-24
    • 2011-11-09
    • 2012-06-26
    • 1970-01-01
    • 2013-07-05
    相关资源
    最近更新 更多