web-dev-qa-db-ja.com

curlでの--cacertと--capathの違いは?

curl内で--cacertオプションと--capathオプションを使用する場合(CLI)。

--cacertは、複数のPEMを含むモノリシックファイルを参照しているようです。一致するホスト名を見つけるためにスキャンを実行すると仮定しますか?

--capathは、複数のファイルが存在するディレクトリを参照しているように見えます。 curlはその中のファイル名として適切な証明書を取得しますか?

23
Jé Queue

docs から:

--cacert(HTTPS)指定した証明書ファイルを使用してピアを検証するようcurlに指示します。ファイルには複数のCA証明書が含まれる場合があります。証明書はPEM形式である必要があります。このオプションを複数回使用すると、最後のオプションが使用されます。

--capath(HTTPS)curlに指定された証明書ディレクトリを使用してピアを検証するよう指示します。証明書はPEM形式である必要があり、ディレクトリはopensslで提供されるc_rehashユーティリティを使用して処理されている必要があります。証明書ディレクトリはWindowsではサポートされていません(c_rehashはsymbolinkリンクを使用して作成するため)。 --capathを使用すると、--cacertファイルに多くのCA証明書が含まれている場合、--cacertを使用するよりもcurlがhttps接続をはるかに効率的に行うことができます。このオプションを複数回使用すると、最後のオプションが使用されます。

そのため、-cacertを指定すると、CA証明書は指定されたファイルに保存されます。これらのCA証明書は、cURLが接続するリモートサーバーの証明書を検証するために使用されます。

--capathオプションは、単一のファイルではなく、CA証明書を含むディレクトリを指定するために使用されます。 c_rehashユーティリティを使用して、ディレクトリを準備する必要があります。つまり、必要なリンクを作成します。 --capathを使用する主な利点は、多くのCA証明書がある場合、-cacert単一ファイルアプローチよりも効率的であると思われます。

C_rehashが行うことをおそらく行うスクリプトは次のとおりです。

for file in *.pem; do ln -s $file `openssl x509 -hash -noout -in $file`.0; done

両方のオプションを使用すると、信頼するCAからのCA証明書のみを含めるように注意する必要があります。たとえば、リモートサーバーがYourCompanyCAからの証明書を常に発行する必要があることがわかっている場合、これが含める必要がある唯一のCA証明書です。

25
PhilR

Windowsでは、バッチファイルとして次を実行し、capathフォルダー名を渡すことができます。

c_rehash.cmd:

@echo off
setlocal enableextensions enabledelayedexpansion
if \%1\ EQU \\ goto :usage
pushd %1
if NOT ERRORLEVEL 0 goto :usage
del *.0
for %%I in (*.pem) do call :hash %%I
popd
goto :eof
:hash
for /F "usebackq" %%J in (`openssl x509 -in %1 -hash -noout`) do mklink %%J.0 %1
goto :eof
:usage
echo Usage:
echo.
echo Rehash a folder of x509 Certificates for Curl
echo.
echo %~n0 ^<Folder^>

例:

c_rehash c:\cacerts
1
Darrek