質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

1回答

1388閲覧

Alpine 3.7 で curl 'https://pecl.php.net/' をした時に curl: (60) SSL certificate problem とならないようにする

ytyng

総合スコア24

cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

1グッド

0クリップ

投稿2023/07/24 02:41

実現したいこと

Docker 上の Alpine 3.7 を下記コマンドで起動した後に

shell

1docker run --rm -it alpine:3.7 /bin/ash

Alpine 内で下記コマンドを実行し

shell

1apk add curl 2curl -v 'https://pecl.php.net/'

下記のエラーが表示されずに HTTPレスポンス内容を表示されるようにしたい。

curl: (60) SSL certificate problem: certificate has expired More details here: https://curl.haxx.se/docs/sslcerts.html curl failed to verify the legitimacy of the server and therefore could not establish a secure connection to it. To learn more about this situation and how to fix it, please visit the web page mentioned above.

前提

Alpine 3.7 であることが必須です。例えば Alpine 3.15 ではこの問題は発生しませんが、今回の質問の対象外です。

また、curl コマンドに証明書を無視するオプションを追加したり、証明書のパスを引数として与えることも、今回の質問の対象外です。

shell

1docker run --rm -it alpine:3.7 /bin/ash

を行った後、Docker コンテナ内で何かのコマンドを実行し、

shell

1curl -v 'https://pecl.php.net/'

これがエラーにならないことが目標になります。

発生している問題・エラーメッセージ

% docker run --rm -it alpine:3.7 /bin/ash (git)-[master] / # apk add curl fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/aarch64/APKINDEX.tar.gz fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/aarch64/APKINDEX.tar.gz (1/4) Installing ca-certificates (20190108-r0) (2/4) Installing libssh2 (1.9.0-r1) (3/4) Installing libcurl (7.61.1-r3) (4/4) Installing curl (7.61.1-r3) Executing busybox-1.27.2-r11.trigger Executing ca-certificates-20190108-r0.trigger OK: 6 MiB in 17 packages / # curl -v 'https://pecl.php.net/' * Trying 104.236.228.160... * TCP_NODELAY set * Connected to pecl.php.net (104.236.228.160) port 443 (#0) * ALPN, offering http/1.1 * successfully set certificate verify locations: * CAfile: /etc/ssl/certs/ca-certificates.crt CApath: none * TLSv1.2 (OUT), TLS handshake, Client hello (1): * TLSv1.2 (IN), TLS handshake, Server hello (2): * TLSv1.2 (IN), TLS handshake, Certificate (11): * TLSv1.2 (OUT), TLS alert, certificate expired (557): * SSL certificate problem: certificate has expired * Closing connection 0 curl: (60) SSL certificate problem: certificate has expired More details here: https://curl.haxx.se/docs/sslcerts.html curl failed to verify the legitimacy of the server and therefore could not establish a secure connection to it. To learn more about this situation and how to fix it, please visit the web page mentioned above. / #

試したこと

shimizu-saffle👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

curl: (60) SSL certificate problem: certificate has expired

これを日本語に訳すと

curl: (60) SSL証明書の問題: 証明書は期限切れです

となります。

エラーメッセージの意味は「証明書が期限切れになっている」ということですが、pecl.php.netのサーバ証明書を確認すると期限切れになっていません。

ですので、Alpine Linuxにインストールされた信頼しているルート証明書が古いのだと考えられます。つまり、pecl.php.netのサーバ証明書の検証に使えるルート証明書がインストールされていません。

Alpine Linuxであれば、信頼しているルート証明書はca-certificatesというパッケージで提供されているはずです。しかし、Alpine 3.7は2019年03月06日を以てend of lifeを迎えていますので、アップデートされたca-certificatesパッケージは入手できません。

対応としては、次のような選択肢があると思います。

  1. 必要なルート証明書を自分でインストールする。
  2. curl コマンドに何らかのオプション (証明書を無視する等) を追加する。
  3. EOLになっていないバージョンのAlpine Linuxを使う。

追記

ご質問の意図は、上記1.の方法を知りたいということだったそうです。以下説明します。

必要なルート証明書 (及び中間認証局証明書) を特定して入手する方法については、pecl.php.netのサーバ証明書を調べることで調べることができます。しかし、この方法を説明しだすととても長くなってしまうので、調べる方法がわからないときは別の質問で聞いてください。

さて、必要な証明書を入手できたら、Dockerfileに次のものを記述する必要があるでしょう。

RUN apk update && apk add ca-certificates COPY 証明書.crt /usr/local/share/ca-certificates/ RUN update-ca-certificates

なお、ca-certificatesがインストールされておらず、apkコマンドが失敗するようなら、ca-certificatesバンドルをなんらかの方法で入手してインストールしてください。
また、証明書ファイルの拡張子は.crtにする必要があります。

処理の内容について詳しくは、update-ca-certificatesコマンドのマニュアルページを参照してください。

投稿2023/07/24 04:09

編集2023/07/24 08:33
ikedas

総合スコア4443

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ytyng

2023/07/24 06:52

回答ありがとうございます。 はい、今回の質問は、1の具体的な手順を教えてほしいという意図になります。 2,3 は、前提条件に書いた通り、今回の質問の範囲外となります。
ikedas

2023/07/24 07:32

であれば最初から「必要なルート証明書を自分でインストールする方法を教えてほしい」と質問に書いてくださればよかったのでは。
ytyng

2023/07/24 09:42

ありがとうございます! 情報を参考に調査します。
ikedas

2023/07/27 06:04

ほかにこの質問で聞きたいことありますか。 とりあえずこれ以上聞くことがないのなら、質問を解決済みにしておいてください。
ytyng

2023/07/31 04:25

追加の質問はございません。 申し訳ありませんが、まだ調査中のためこの問題は解決していません。 前提条件に書いてある ``` curl -v 'https://pecl.php.net/' ``` これがエラーにならない具体的な方法が達成されていないためです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問