.NET从AWS S3读取加密文件 - 某些文件在prod上失败,在dev上成功

时间:2016-11-17 15:24:19

标签: .net ssl amazon-s3 x509certificate2

我正在为S3云应用程序运行S3的证书存储区。 S3CertificateStore类从S3读取.pfx文件和密码文件,并在内存中创建证书。

private void LoadPrivateCerts(X509Certificate2Collection certificates)
        {
            var s3Files = S3Facade.ListObjects(Config.Bucket, Config.PrivatePath).ToList();

            foreach (var filePath in s3Files)
            {
                if (filePath.EndsWith(".pass") || filePath.EndsWith("/"))
                {
                    continue;
                }
                try
                {
                    var certBytes = S3Facade.GetObject(Config.Bucket, filePath);
                    var pwdBytes = S3Facade.GetObject(Config.Bucket, filePath + ".pass");
                    var pwd = Encoding.UTF8.GetString(pwdBytes);

                    var cert = new X509Certificate2(certBytes, pwd, X509KeyStorageFlags.Exportable);    // needs to be exportable!
                    certificates.Add(cert);
                }
                catch (Exception e)
                {
                    exceptions.Add(e);
                }
            }
        }

当我在本地运行时,所有证书都从S3中提取并正确重构。但是......当我在EC2实例上运行代码时,一些证书很好,而其他证书则失败。 (同样总是失败)。

EXCEPTION: The system cannot find the file specified.

   at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
   at System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromBlob(Byte[] rawData, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx)
   at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte[] rawData, Object password, X509KeyStorageFlags keyStorageFlags)

我感到困惑。工作中会出现某种字符编码差异吗?我不认为任何密码都有高位字符,但是我可能会在某些东西被用完之后看到它们。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我找到了一个可行的解决方案。如果我设置IIS AppPool设置"加载用户配置文件"到真,然后证书建设工作。 .ebextension文件中的以下脚本似乎可以解决这个问题:

c:\windows\system32\inetsrv\appcmd.exe set config /section:applicationPools "/[name='DefaultAppPool'].processModel.loadUserProfile:true"

在这次变更之前,我仍然不明白为什么证书构建在某些证书上一直是成功的,并且在其他证书之前一直失败。