Tôi đang cố gắng thêm lập trình ràng buộc vào trang web mặc định của mình tuy nhiên tôi liên tục nhận được ngoại lệ tham chiếu null trong tệp Microsoft.Web.Administration. Ban đầu tôi muốn chỉ định một chứng chỉ cùng với ràng buộc. Tôi đã có thể truy vấn chứng chỉ mà tôi muốn với điều này:NullReferenceException trong Microsoft.Web.Quản trị khi thêm https binding
var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadWrite);
var certificate = store.Certificates.Find(X509FindType.FindByIssuerName,
"TEST_SELF_SIGNED", true)
.OfType<X509Certificate>().FirstOrDefault();
Điều này đã cho tôi chứng chỉ tôi muốn, nó không có giá trị và có thông tin tôi mong đợi.
Site site = GetSite("Default Web Site");
var binding = site.Bindings.Add("*:443", certificate.GetCertHash(), "https");
Vì không có biến nào của tôi hoặc bất kỳ mục nào khác trong mã mẫu không có giá trị (bao gồm GetCertHash trả về mảng 20 byte). Tôi thậm chí đã cố gắng quá tải sau:
site.Bindings.Add("*:443", "https");
Và tôi vẫn nhận được cùng vô ref stack:
System.NullReferenceException was unhandled Message=Object reference not set to an instance of an object. Source=Microsoft.Web.Administration StackTrace: at Microsoft.Web.Administration.Configuration.SetDirty() at Microsoft.Web.Administration.ConfigurationElement.SetDirty() at Microsoft.Web.Administration.ConfigurationElement.SetAttributeValue(String attributeName, Object value) at Microsoft.Web.Administration.Binding.SetBindingProperty(String attributeName, String value) at Microsoft.Web.Administration.BindingCollection.Add(String bindingInformation, Byte[] certificateHash, String certificateStoreName) at TestApp.Program.Main(String[] args) in C:\Projects\Cube\trunk\src\AutoUpdate\TestApp\Program.cs:line 33 at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() InnerException:
Dưới đây là một thử nghiệm ứng dụng đầy đủ mà demonstartes vấn đề này, cùng với các đối số dòng lệnh SELFSSL tôi sử dụng để tạo ra các giấy chứng nhận mẫu:
selfssl.exe/T/N: CN = TEST_SELF_SIGNED/K: 512/V: 9999/Q
class Program
{
static void Main(string[] args)
{
using (ServerManager manager = new ServerManager())
{
var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadWrite);
var certificate = store.Certificates.Find(X509FindType.FindByIssuerName, "TEST_SELF_SIGNED", true).OfType<X509Certificate>().FirstOrDefault();
Site site = GetSite("Default Web Site");
site.Bindings.Add("*:443", certificate.GetCertHash(), store.Name);
store.Close();
manager.CommitChanges();
}
}
public static Site GetSite(string siteName)
{
using (var serverManager = new ServerManager())
{
return serverManager.Sites.Where(p => p.Name.ToLower() == siteName.ToLower()).FirstOrDefault();
}
}
}
Chỉ để trang trải các căn cứ của tôi, IIS được cài đặt và gán thủ công chứng chỉ hoạt động tốt.