第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

C#/.NET 中的根證書固定

C#/.NET 中的根證書固定

C#
動(dòng)漫人物 2022-10-23 15:48:45
我想在我的 C# 應(yīng)用程序中實(shí)現(xiàn)證書/公鑰固定。我已經(jīng)看到了很多直接固定服務(wù)器證書的解決方案,例如在這個(gè)問題中。但是,為了更靈活,我只想固定根證書。服務(wù)器在設(shè)置中獲得的證書由中間 CA 簽名,該 CA 本身由根簽名。到目前為止,我實(shí)現(xiàn)的是一個(gè)服務(wù)器,它從 PKCS#12 (.pfx) 文件中加載自己的證書、私鑰、中間證書和根證書。我使用以下命令創(chuàng)建了文件:openssl pkcs12 -export -inkey privkey.pem -in server_cert.pem -certfile chain.pem -out outfile.pfxchain.pem文件包含根證書和中間證書。服務(wù)器加載此證書并希望對(duì)客戶端進(jìn)行身份驗(yàn)證:// certPath is the path to the .pfx file created beforevar cert = new X509Certificate2(certPath, certPass)var clientSocket = Socket.Accept();var sslStream = new SslStream(    new NetworkStream(clientSocket),    false);try {    sslStream.AuthenticateAsServer(cert, false, SslProtocols.Tls12, false);} catch(Exception) {     // Error during authentication}現(xiàn)在,客戶端想要對(duì)服務(wù)器進(jìn)行身份驗(yàn)證:public void Connect() {    var con = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);    con.Connect(new IPEndPoint(this.address, this.port));    var sslStream = new SslStream(        new NetworkStream(con),        false,        new RemoteCertificateValidationCallback(ValidateServerCertificate),        null    );    sslStream.AuthenticateAsClient("serverCN");}public static bool ValidateServerCertificate(    object sender,    X509Certificate certificate,    X509Chain chain,    SslPolicyErrors sslPolicyErrors){    // ??}現(xiàn)在的問題是服務(wù)器只將自己的證書發(fā)送給客戶端。鏈參數(shù)也不包含更多信息。這在某種程度上是合理的,因?yàn)閄509Certificate2 證書(在服務(wù)器代碼中)僅包含服務(wù)器證書,沒有關(guān)于中間證書或根證書的信息。但是,客戶端無法驗(yàn)證整個(gè)鏈,因?yàn)椋ㄖ辽伲┤鄙僦虚g證書。到目前為止,我還沒有發(fā)現(xiàn)任何讓 .NET 發(fā)送整個(gè)證書鏈的可能性,但我不想固定服務(wù)器證書本身或中間證書,因?yàn)檫@破壞了根證書固定的靈活性。因此,有沒有人知道讓 SslStream 發(fā)送整個(gè)鏈進(jìn)行身份驗(yàn)證或使用其他方法實(shí)現(xiàn)功能的可能性?還是我必須以不同的方式包裝證書?謝謝!編輯:我做了一些其他測試來檢測問題。正如評(píng)論中所建議的,我創(chuàng)建了一個(gè)X509Store包含所有證書的證書。之后,我X509Chain使用我的服務(wù)器證書和商店構(gòu)建了一個(gè)。在服務(wù)器本身上,新鏈正確包含所有證書,但不在ValidateServerCertificate函數(shù)中。
查看完整描述

1 回答

?
達(dá)令說

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超6個(gè)贊

SslStream 永遠(yuǎn)不會(huì)發(fā)送整個(gè)鏈(自我頒發(fā)的證書除外)。約定是發(fā)送除根以外的所有內(nèi)容,因?yàn)榱硪环揭匆呀?jīng)擁有并信任根,要么沒有(因此/或不信任根),無論哪種方式都是浪費(fèi)帶寬。

但是 SslStream 只有在理解中間體時(shí)才能發(fā)送中間體。

var cert = new X509Certificate2(certPath, certPass);

這只會(huì)提取最終實(shí)體證書(帶有私鑰的證書),它會(huì)丟棄 PFX 中的任何其他證書。如果要加載需要使用的所有證書X509Certificate2Collection.Import。但是......這也對(duì)你沒有幫助。SslStream 只接受最終實(shí)體證書,它希望系統(tǒng)能夠?yàn)樗鼧?gòu)建一個(gè)功能鏈。

為了構(gòu)建功能鏈,您的中間證書和根證書需要位于以下任一位置:

  • 通過 X509Chain.ChainPolicy.ExtraStore 作為手動(dòng)輸入提供

    • 由于有問題的鏈?zhǔn)怯?SslStream 構(gòu)建的,因此您不能在這里真正做到這一點(diǎn)。

  • 當(dāng)前用戶\我的 X509Store

  • *LocalMachine\My X509Store

  • CurrentUser\CA X509Store

  • **LocalMachine\CA X509Store

  • CurrentUser\Root X509Store

  • **LocalMachine\Root X509Store

  • *LocalMachine\ThirdPartyRoot X509Store

  • http在證書的授權(quán)訪問標(biāo)識(shí)符擴(kuò)展中標(biāo)識(shí)的(非 s)位置。

*在 Linux 上的 .NET Core 上不存在標(biāo)記為的商店。標(biāo)記 的存儲(chǔ)**在 Linux 上確實(shí)存在,但不能由 .NET 應(yīng)用程序修改。

這還不夠,因?yàn)椋ㄖ辽賹?duì)于 Linux 上的 SslStream 和 .NET Core 上的 macOS 而言)它仍然只在構(gòu)建它信任的鏈時(shí)才發(fā)送中間體。因此,服務(wù)器需要真正信任根證書才能發(fā)送中間證書。(或者客戶端需要信任客戶端證書的根)


另一方面,同樣的規(guī)則也適用。不同之處在于,在回調(diào)中您可以選擇重建鏈以添加額外的證書。

private static bool IsExpectedRootPin(X509Chain chain)

{

    X509Certificate2 lastCert = chain.ChainElements[chain.ChainElements.Count - 1].Certificate;

    return lastCert.RawBytes.SequenceEquals(s_pinnedRootBytes);

}


private static bool ValidateServerCertificate(

    object sender,

    X509Certificate certificate,

    X509Chain chain,

    SslPolicyErrors sslPolicyErrors

)

{

    if ((sslPolicyErrors & ~SslPolicyErrors.RemoteCertificateChainErrors) != 0)

    {

        // No cert, or name mismatch (or any future errors)

        return false;

    }


    if (IsExpectedRootPin(chain))

    {

        return true;

    }


    chain.ChainPolicy.ExtraStore.Add(s_intermediateCert);

    chain.ChainPolicy.ExtraStore.Add(s_pinnedRoot);

    chain.ChainPolicy.VerificationFlags |= X509VerificationFlags.AllowUnknownCertificateAuthority;


    if (chain.Build(chain.ChainElements[0].Certificate))

    {

        return IsExpectedRootPin(chain);

    }


    return false;

}

當(dāng)然,這種方法的問題是你還需要了解并提供遠(yuǎn)程端的中間件。真正的解決方案是中間體應(yīng)該在 HTTP 分發(fā)端點(diǎn)上可用,并且頒發(fā)的證書應(yīng)該帶有授權(quán)信息訪問擴(kuò)展,以便能夠動(dòng)態(tài)定位它們。


查看完整回答
反對(duì) 回復(fù) 2022-10-23
  • 1 回答
  • 0 關(guān)注
  • 188 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)