1

Thawte (および他のいくつかの CA) が 1024 ビット ルートから新しいより安全な 2048 ビット ルートに移行して以来、Thawte ワイルドカード証明書などの特定の SSL 証明書の検証は複雑になっています。 " 証明書チェーンに含まれています。

これにより、特定のブラウザーが Windows にインストールされたときに証明書を検証できなくなりました。手動による解決策はhttp://www.tbs-certificats.com/FAQ/en/608.htmlにあります。

ここでの課題は、Web サイトの基盤となる OS インスタンスをいつでも変更できる Microsoft Azure などの特定のホスティング環境では、ルート証明書が継続的に元の「エラー」に「更新」されるため、このような手動の変更は役に立たないことです。州。

いくつかの記事は、この変更をプログラムで行う正しい方向を示しています ( http://en-us.sysadmins.lv/Lists/Posts/Post.aspx?List=332991f0-bfed-4143-9eea-f521167d287c&ID=69およびhttp ://forums.asp.net/t/1531893.aspx/1 )。これを行う唯一の方法は、CryptoAPI を使用することです。

以下は、これを試して達成するための私のコンソール アプリ コードです。

class Program
    {
        [DllImport("Crypt32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        public static extern bool CertGetCertificateContextProperty(
            IntPtr pCertContext,
            uint dwPropId,
            Byte[] pvData,
            ref uint pcbData
        );

        [DllImport("Crypt32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        public static extern bool CertSetEnhancedKeyUsage(
            IntPtr pCertContext,
            IntPtr pUsage
        );

        static void Main(string[] args)
        {
            try
            {
                X509Store store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
                store.Open(OpenFlags.ReadWrite | OpenFlags.OpenExistingOnly);

                X509Certificate2 cert = store.Certificates.Find(X509FindType.FindBySerialNumber, "344ed55720d5edec49f42fce37db2b6d", false)[0];

                if (!cert.Equals(IntPtr.Zero))
                {
                    uint pcbData = 0;
                    // if the function returns True, then certificate purposes are either disabled or constrained
                    // otherwise (False) valid purposes are determined by certificate's EKU
                    if (CertGetCertificateContextProperty(cert.Handle, 0x9, null, ref pcbData))
                    {
                        // create a buffer for ASN.1 encoded byte array
                        byte[] pvData = new byte[pcbData];
                        // call the function again to write actual data
                        CertGetCertificateContextProperty(cert.Handle, 0x9, pvData, ref pcbData);
                        // instantiate AsnEncodedData object with ASN.1 encoded byte array
                        AsnEncodedData asn = new AsnEncodedData("", pvData);
                        // instaintiate X509EnhancedKeyUsageExtension to retrieve OIDs in a readable form
                        X509EnhancedKeyUsageExtension eku = new X509EnhancedKeyUsageExtension(asn, false);
                        // if none OIDs are defined, then all certificate purposes are explicitly diabled in the properties
                        if (eku.EnhancedKeyUsages.Count == 0)
                        {
                            Console.WriteLine("All purposes for this certificate are explicitly disabled.");
                        }
                        else
                        {
                            // constrained OIDs
                            OidCollection keyUsages = eku.EnhancedKeyUsages;

                            // disable all purposes by emptying EnhancedKeyUsages
                            IntPtr pUsage = Marshal.AllocHGlobal(0);
                            CertSetEnhancedKeyUsage(cert.Handle, pUsage);                           
                        }
                    }
                    else
                    {
                        Console.WriteLine("Valid purposes are determined by the certificate EKU extension.");
                    }
                }
                else
                {
                    throw new ArgumentException("An attempt was made to access an uninitialized object.");
                }

                store.Close();
            }
            catch (CryptographicException)
            {
                Console.WriteLine("Information could not be written out for this certificate.");
            }

            Console.ReadLine();
        }
    }

コンソール アプリの 2 回目の実行ではすべての目的が無効になっているように見えるため、これの結果は良好に見えますが、変更が certmgr.msc に表示されず、目的がまだ有効に見えることに注意してください。

また、上記のコードを MVC Web サイトの Global.asax に配置しても、証明書には何の影響もないようです。

だから私の質問は2倍です:

  1. 証明書のすべての目的を無効にして、Windows 証明書スナップインに証明書の変更が表示されるようにするにはどうすればよいですか?

  2. ASP.NET でこれを永続的に達成するにはどうすればよいですか?

4

0 に答える 0