2009-08-28 37 views
70

Tôi đang cố gắng sử dụng chứng chỉ tự ký (C#):"Đã xảy ra lỗi nội bộ". khi tải tập tin PFX với X509Certificate2

X509Certificate2 cert = new X509Certificate2(
    Server.MapPath("~/App_Data/myhost.pfx"), "pass"); 

trên một máy chủ lưu trữ web chia sẻ và tôi đã nhận một lỗi:

System.Security.Cryptography.CryptographicException: An internal error occurred. 

stack trace đầu với

System.Security.Cryptography.CryptographicException. 
    ThrowCryptogaphicException(Int32 hr) +33 
System.Security.Cryptography.X509Certificates.X509Utils. 
    _LoadCertFromFile(String fileName, IntPtr password, UInt32 dwFlags, 
     Boolean persistKeySet, SafeCertContextHandle& pCertCtx) +0 
System.Security.Cryptography.X509Certificates.X509Certificate. 
    LoadCertificateFromFile(String fileName, Object password, 
     X509KeyStorageFlags keyStorageFlags) +237 
System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(
    String fileName, String password) +131 

Trên máy tính của tôi, nó tải ok. Lý do tôi tải * .pfx không phải là tệp * .cer vì tôi cần có khóa truy cập riêng (tệp cer tải Ok). tôi đã PFX trên mochine dev của tôi như thế:

makecert -r -n "CN=myhost.com, [email protected]" -sky exchange -b 01/01/2009 
    -pe -sv myhost.pvk myhost.cer 
<b>pvk2pfx</b> -pvk myhost.pvk -spc myhost.cer -pfx myhost.pfx -po pass</code> 

Tôi đang sử dụng phiên bản v5.131.3790.0 của makecert

+0

Có lẽ bài viết này có thể trợ giúp: http://www.codeproject.com/KB/WCF/wcfcertificates.aspx – Emmanuel

+0

Tôi nhận được thông báo lỗi 'hệ thống không thể tìm thấy tệp được chỉ định'. Câu trả lời của @Randy Levy đã làm việc cho tôi! – Jess

Trả lời

136

Sử dụng các cửa hàng máy tính địa phương cho khóa bí mật:

X509Certificate2 cert = new X509Certificate2("myhost.pfx", "pass", 
    X509KeyStorageFlags.MachineKeySet); 

MachineKeySet được mô tả là "khóa riêng được lưu trữ trong cửa hàng máy tính cục bộ thay vì lưu trữ người dùng hiện tại". Mặc định không có cờ là để đặt trong cửa hàng người dùng.

Mặc dù bạn đang đọc chứng chỉ từ đĩa và lưu trữ nó trong một đối tượng, khóa riêng tư vẫn được lưu trữ trong cơ sở dữ liệu khóa của Nhà cung cấp dịch vụ mật mã API của Cryptographic API của Microsoft. Trên máy chủ lưu trữ, quá trình ASP.NET không có quyền truy cập vào kho lưu trữ của người dùng.

Cách tiếp cận khác (theo một số nhận xét bên dưới) là sửa đổi cấu hình IIS hoặc bản sắc ứng dụng bơi - hoạt động. Tuy nhiên, điều này giả định rằng có quyền truy cập vào các mục cấu hình này có thể không phải là trường hợp (ví dụ: trong môi trường lưu trữ được chia sẻ).

+3

có nó giúp, cảm ơn. bạn có thể giải thích tại sao không? tài liệu nói không có gì hữu ích. –

+2

Bạn đã lưu ngày của tôi. Thật kỳ lạ, nó hoạt động trên máy của tôi trước khi nâng cấp giải pháp lên .NET 4.0 –

+1

Thật vậy, tất cả những gì cần làm là thiết lập tham số X509KeyStorageFlags.MachineKeySet. Nó thực sự buồn rằng ngoại lệ ném đơn giản chỉ ra "Một lỗi nội bộ xảy ra." Không phải rất hữu ích. – Nicholi

8

tôi đã cố gắng giải pháp Randy của thay đổi nó để MachineKeySet, nhưng sau đó nhận được thông báo lỗi:

"chìa khóa không hợp lệ để sử dụng trong nhà nước quy định"

Vì vậy, sau một chút googling xung quanh tôi tìm thấy một bài mà đề xuất thay đổi nó thành:

var certificate = new X509Certificate2(certKeyFilePath, passCode, 
X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet |  
X509KeyStorageFlags.PersistKeySet); 

và điều này đã giải quyết được vấn đề của tôi.

Tôi chưa thử đề xuất thay đổi cài đặt nhóm ứng dụng cài đặt trong cấu hình IIS. Để thực hiện việc này, hãy chuyển đến Cài đặt nâng cao cho nhóm ứng dụng của trang web của bạn, sau đó đặt "tải hồ sơ người dùng" thành true. Khi cài đặt này là sai, các vùng chứa khóa không thể truy cập được.

+0

Tôi đã nhận được lỗi được đề cập ở trên và giải pháp của bạn đã giúp giải quyết nó. cảm ơn bạn. – mohang

Các vấn đề liên quan