"Đã xảy ra lỗi nội bộ." khi tải tệp pfx với X509Certificate2


79

Tôi đang thử sử dụng chứng chỉ tự ký (c #):

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

trên máy chủ lưu trữ web được chia sẻ và tôi gặp lỗi:

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

dấu vết ngăn xếp kết thúc bằng

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 dev của tôi, nó tải ok. Lý do tôi tải * .pfx không phải tệp * .cer vì tôi cần quyền truy cập khóa cá nhân (tệp cer tải Ok). Tôi đã tạo pfx trên dev mochine của mình như vậy:

makecert -r -n "CN=myhost.com, E=admin@myhost.com" -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


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

Tôi đã nhận được thông báo lỗi the system cannot find the file specified. Câu trả lời của @Randy Levy phù hợp với tôi!
Jess

Câu trả lời:


145

Sử dụng cửa hàng máy tính cục bộ cho khóa cá nhân:

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ộ chứ không phải cửa hàng 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.

Ngay cả khi bạn đang đọc chứng chỉ từ đĩa và lưu trữ nó trong một đối tượng, các khóa cá nhân vẫn được lưu trữ trong cơ sở dữ liệu khóa của Microsoft Cryptographic API Cryptographic Service Provider. Trên máy chủ lưu trữ, tiến trình ASP.NET không có quyền truy cập vào cửa hàng người dùng.

Một 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 danh tính Nhóm ứng dụng - những thứ 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 đúng với trường hợp này (ví dụ: trong môi trường lưu trữ được chia sẻ).


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

2
Bạn đã cứu ngày của tôi. Lạ lùng thay, nó làm việc trên máy tính của tôi trước khi nâng cấp giải pháp cho .NET 4.0
Marc Climent

1
Thật vậy, tất cả những gì cần làm là đặt tham số X509KeyStorageFlags.MachineKeySet. Thật đáng buồn khi ngoại lệ được ném ra chỉ đơn giản là "Đã xảy ra lỗi nội bộ." Không hữu ích lắm.
Nicholi

2
Bạn cũng có thể thêm nhiều đặc quyền hơn trên khóa cá nhân vào tài khoản được chỉ định cho nhóm ứng dụng. Hoặc thay đổi danh tính nhóm ứng dụng thành "Dịch vụ địa phương".
guzart 19/12/11

1
Và đối với một nhanh hơn sửa chữa / kiểm tra workaround: stackoverflow.com/questions/9951729/...
Ciprian Teiosanu

13

Tôi đã thử giải pháp của Randy là thay đổi nó thành MachineKeySet, nhưng sau đó nhận được thông báo lỗi:

"khóa không hợp lệ để sử dụng ở trạng thái được chỉ định"

Vì vậy, sau khi tìm kiếm xung quanh một chút, tôi đã tìm thấy một bài đăng đề 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á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 trên 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 sai, các vùng chứa khóa dường như không thể truy cập được.


Tôi đã gặp 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.
Mohan Gundlapalli

Tôi không thích những nhận xét không hữu ích (như thế này) nhưng hãy để tôi nói với bạn rằng bạn đã tiết kiệm một ngày của tôi. Cảm ơn!
rasputino
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.