web-dev-qa-db-ja.com

Webブラウザー内で、JavaScriptが現在のページで使用されているHTTPS証明書に関する情報を取得することは可能ですか?

ブラウザで実行されているJavaScriptが、ブラウザの現在のHTTPS接続に対してリモートホストを認証するために使用されているCA証明書を判別し、CAの名前など、その証明書のプロパティを取得する方法はありますか?

そうでない場合は、ActiveX、Java、サーバー側のCGIなど、この情報をプログラムで取得するための他のオプションはありますか?

24
sutch

これを行うには、オープンソース Forgeプロジェクト を使用できます。 JavaScriptでSSL/TLSを実装します。サーバーにajax呼び出しを行い、コールバックを使用して証明書を検査できます。サーバーはJavaScriptを送信するサーバーであるため、JavaScriptの送信元のサーバーを信頼するかどうかを判断するためにこれを使用しないでください。 Forgeプロジェクトではクロスドメインリクエストが許可されているため、これを信頼に使用している場合は、既に信頼しているサーバーからForge JavaScriptを読み込んでから、まだ信頼していないサーバーに接続できます。ただし、他のサーバーがクロスドメインポリシーを提供しない限り、クロスドメインリクエストを実行することはできません。

https://github.com/digitalbazaar/forge/blob/master/README.md

READMEのブログリンクには、Forgeの使用方法と機能に関する詳細情報が記載されています。

18
dlongley

から自分の回答をコピーするChrome Extension から証明書情報にアクセスする方法はありますか?

2018年の回答:はい、Firefox62で

ブラウザ拡張機能とも呼ばれるWebExtensionを作成する必要があります。

MDNのセキュリティ情報へのアクセス を参照してください

次のドキュメントを確認することもできます。

Firefox62が必要です。

これが機能していますbackground.js

var log = console.log.bind(console)

log(`\n\nTLS browser extension loaded`)

// https://developer.chrome.com/extensions/match_patterns
var ALL_SITES = { urls: ['<all_urls>'] }

// Mozilla doesn't use tlsInfo in extraInfoSpec 
var extraInfoSpec = ['blocking']; 

// https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/webRequest/onHeadersReceived
browser.webRequest.onHeadersReceived.addListener(async function(details){
    log(`\n\nGot a request for ${details.url} with ID ${details.requestId}`)

    // Yeah this is a String, even though the content is a Number
    var requestId = details.requestId

    var securityInfo = await browser.webRequest.getSecurityInfo(requestId, {
        certificateChain: true,
        rawDER: false
    });

    log(`securityInfo: ${JSON.stringify(securityInfo, null, 2)}`)

}, ALL_SITES, extraInfoSpec) 

log('Added listener')

manifest.json

{
    "manifest_version": 2,
    "name": "Test extension",
    "version": "1.0",
    "description": "Test extension.",
    "icons": {
        "48": "icons/border-48.png"
    },
    "background": {
        "scripts": ["background.js"]
    },
    "permissions": [
        "webRequest",
        "webRequestBlocking",
        "<all_urls>"
    ]
}

enter image description here

また、Chromiumに一度実装することもできます このコードはマージされます

9
mikemaccana

いいえ。AJAX/ ActiveX/Java/Flash/Silverlightとカスタムサーバーサイドスクリプトを使用してそれを行うことはできますが、なぜこれが必要になるのかわかりません。


編集:上記の考え方は、サーバーに対して(上記のテクノロジーのいずれかを使用して)ネットワーク要求を行い、そのネットワーク要求に使用された証明書を尋ねることです。その後、サーバーは自身の構成を検査して質問に答えることができます。

ブラウザが何らかの理由で無効な証明書を信頼し、間違ったサーバー(MITMサーバーなど)に接続している場合、サーバーが嘘をついている可能性があります。ブラウザの信頼メカニズムが危険にさらされると、それを回避する方法がわかりません。

私の知る限り、「ブラウザの現在のSSL接続に」使用している証明書をブラウザに直接問い合わせる方法はありません(純粋にクライアント側のAPIを使用しています)。 Forgeでさえそれをしません。完全にparallel SSLセッションを作成しますが、ブラウザのネイティブSSLセッションについて質問することはできません。

3

Webブラウザで実行されているJavaScriptは、証明書情報にアクセスできません。証明書情報もHTTPを介してアプリケーションに渡されません。私の調査によると、man-in-the-middle攻撃がホストとクライアントの間のどこかに偽の証明書を挿入したかどうかをWebアプリケーションが判断する方法はありません。

2
sutch

JavascriptだけではないAFAIK。ただし、一部のWebサーバーでは、スレッドまたはプロセスの接続パラメーターにアクセスできます。サーバーサイドスクリプトは、リクエストとともにこれらの値を送信でき、ユーザーはそれを使用します。

私はnginxウェブサーバーでこれを見つけました: http://wiki.nginx.org/NginxHttpSslModule (変数についてはページの下部を見てください)。それらを環境変数として設定し、FastCGIプロセスまたは使用するものに渡すことができるはずです。

AOLServer/Naviserverは、nssslモジュールと同様のアクセスを許可します。

1
initall