2009-05-22 33 views
16

Tôi có một ứng dụng .NET mà tôi muốn sử dụng làm ứng dụng khách để gọi dịch vụ web SSL SOAP. Tôi đã được cung cấp chứng chỉ ứng dụng khách hợp lệ được gọi là foo.pfx. Có một mật khẩu trên chứng chỉ.X509Certificate.CreateFromCertFile - mật khẩu mạng được chỉ định không chính xác

tôi đã định vị được chứng nhận tại vị trí sau: C:\certs\foo.pfx

Để gọi dịch vụ web, tôi cần phải đính kèm giấy chứng nhận của khách hàng. Đây là mã:

public X509Certificate GetCertificateFromDisk(){ 
    try{    

     string certPath = ConfigurationManager.AppSettings["MyCertPath"].ToString(); 
     //this evaluates to "c:\\certs\\foo.pfx". So far so good. 

     X509Certificate myCert = X509Certificate.CreateFromCertFile(certPath); 
     // exception is raised here! "The specified network password is not correct" 

     return cert; 

    } 
    catch (Exception ex){  
     throw; 
    } 
} 

Có vẻ như ngoại lệ là ứng dụng .NET đang cố gắng đọc đĩa. Phương thức CreateFromCertFile là một phương thức tĩnh nên tạo một cá thể mới của X509Certificate. Phương thức này không bị ghi đè và chỉ có một đối số: đường dẫn.

Khi tôi kiểm tra ngoại lệ, tôi tìm thấy điều này:

_COMPlusExceptionCode = -532459699 
Source=mscorlib 

Câu hỏi: không ai biết những gì là nguyên nhân của ngoại lệ "Mật khẩu mạng nào đó là không đúng"?

Trả lời

25

Chỉ ra rằng tôi đã cố tạo chứng chỉ từ tệp .pfx thay vì tệp .cer.

Bài học kinh nghiệm ...

  • cer file là một chứng chỉ X.509 dưới dạng nhị phân. Chúng là DER encoded.
  • tệp .pfx là tệp chứa. Ngoài ra DER được mã hóa. Chúng không chỉ chứa các chứng chỉ, mà còn chứa các khóa riêng ở dạng mã hóa.
+2

Thông tin của bạn đã lưu tôi – user217648

+0

@ p.campell là có thể tải lên chứng chỉ .pfx từ thư mục cục bộ và nhận dấu vân tay của chứng chỉ đó? – drgmak

6

Tùy thuộc vào trường hợp của bạn, bạn có thể cần cài đặt chứng chỉ trên máy chủ trước để có mức độ tin cậy trước khi xuất tệp .cer.

Tôi phải làm điều này cho một dự án tương tự và đây là các ghi chú của tôi về cách nó được thực hiện.

Thay thế Foo.cer bằng cách xuất chứng chỉ được cài đặt trên máy chủ. (Cài đặt cert từ tập tin pfx và sau đó xuất khẩu nó vào một tập tin cer.)

  • lệnh cho IIS6 cho phép truy cập nhóm IIS_WPG đến khóa cert. Cần cài đặt winhttpcertcfg (Bạn có thể theo liên kết bên dưới để lấy bản sao của riêng bạn).

    C: \ Program Files \ Windows Resource Kits \ Tools> winhttpcertcfg -i (Đường dẫn tới tệp pfx, ví dụ: e: \ Certs \ Foo.PFX) -c LOCAL_MACHINE \ My -a -p IIS_WPG (mật khẩu cho tập tin PFX)

  • Phun ra thông tin và tài trợ chính quyền

    Cấp quyền truy cập khóa riêng cho tài khoản:

    (SERVERNAME)\IIS_WPG 
    

Tải xuống WinHttpCertCfg.msihere cài đặt exe.

Thông tin thêm về cách sử dụng cấu hình cert có thể được tìm thấy here.

Sau đó, nó chỉ quay trở lại cách bạn đang thực hiện đẩy chứng chỉ của mình.

//Cert Challenge URL 
Uri requestURI = new Uri("https://someurl"); 

//Create the Request Object 
HttpWebRequest pageRequest = (HttpWebRequest)WebRequest.Create(requestURI); 

//After installing the cert on the server export a client cert to the working directory as Foo.cer 
string certFile = MapPath("Foo.cer"); 
X509Certificate cert = X509Certificate.CreateFromCertFile(certFile); 


//Set the Request Object parameters 
pageRequest.ContentType = "application/x-www-form-urlencoded"; 
pageRequest.Method = "POST"; 
pageRequest.AllowWriteStreamBuffering = false; 
pageRequest.AllowAutoRedirect = false; 
pageRequest.ClientCertificates.Add(cert); 

Đây là cách tôi đã vượt qua chứng chỉ nhưng không chắc chắn chính xác những gì bạn cần làm với chứng nhận của mình để điều này có thể không giống với bạn.

5

Thông báo lỗi 'mật khẩu mạng được chỉ định không chính xác' cũng được trả lại khi chứng chỉ bạn đang cố nhập vào một trong các cửa hàng OS đã có trong cửa hàng đó.

6

Bạn có thể cần phải sử dụng X509Certificate2() với thông số X509KeyStorageFlags.MachineKeySet để thay thế. Điều này cố định một vấn đề tương tự chúng tôi đã có. Tín dụng đến trang web gốc mà gợi ý này: http://vdachev.net/2012/03/07/c-sharp-error-creating-x509certificate2-from-a-pfx-or-p12-file-in-production/

Trích dẫn:

Nguyên nhân

Nguyên nhân của vấn đề dường như không có nhiều việc phải làm với các thông báo lỗi . Vì một lý do nào đó, hàm tạo đang cố gắng truy cập vào kho khóa riêng mặc dù khóa riêng được lưu trữ trong tệp đang được mở. Theo mặc định, lưu trữ khóa người dùng được sử dụng nhưng ASP.NET (và có lẽ là các dịch vụ Windows không tương tác nói chung) là không được phép mở nó. Rất có thể là kho khóa của người dùng cho tài khoản được chọn thậm chí không tồn tại.

Giải pháp

Một điều bạn có thể thử là tạo ra một người sử dụng lưu trữ quan trọng bằng cách đăng nhập vào tài khoản và nhập khẩu một chứng chỉ trong cửa hàng cá nhân của mình (và sau đó loại bỏ nó một lần nữa).

Một giải pháp khác là phải vượt qua một tham số bổ sung cho các nhà xây dựng - một lá cờ cho thấy các phím tin được (nghĩa vụ phải được) lưu trữ trong máy tính cục bộ - X509KeyStorageFlags.MachineKeySet, như thế này: var certificate = new X509Certificate2(fileName, password, X509KeyStorageFlags.MachineKeySet);

Đối với PFX không có mật khẩu, mật khẩu có thể được chỉ định là string.Empty.

cũng https://stackoverflow.com/a/8291956/130352

2

Xem Trong trường hợp của tôi, tôi đã cố gắng để chạy ở chế độ ứng dụng cá nhân và tôi đã nhận các lỗi tương tự.

Các quy định mật khẩu mạng là không đúng

Các constructor PrivateAuthenticator (trong Xero.Api.Example.Applications.Private) đã cố gắng để nhập khẩu giấy chứng nhận giả định không có mật khẩu được xác định trong quá trình tạo chứng chỉ.

_certificate = new X509Certificate2(); 
_certificate.Import(certificatePath); 

Sau đó, tôi đã thay đổi việc nhập khẩu để sử dụng một phương pháp quá tải trong đó sử dụng mật khẩu,

_certificate.Import(certificatePath, "mypasswordusedtocreatethecertificate", X509KeyStorageFlags.MachineKeySet); 
0

Bạn có thể cần phải X509KeyStorageFlags.MachineKeySet.

Tôi đang sử dụng chứng chỉ từ công việc web.

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