SSL_connectは1、errno=0、peeraddr=162.243.189.2:443、state=error: certificate verify failed (Hostname mismatch)を返しました

Digital Ocean Droplet の容量が少なくなってきたため、アップロードされたファイルを Digital Ocean Space に移動したいと考えています。

以下が設定内容です。

  • s3 アクセスキー ID - DO CP > API > Applications & API からコピー

  • s3 シークレットアクセスキー - DO CP > API > Applications & API からコピー

  • s3 リージョン - DO Spaces では重要ではないかもしれませんが、デフォルトの US East (N. Virginia) のままにしました。

  • s3 アップロードバケット - Space にフォルダを作成すべきかどうかが不明です。両方試しました…

    • uploads - Space にフォルダが作成されていないもの
    • files - Space に既にフォルダが作成されているもの
  • s3 エンドポイント - ここが間違っていると思います。https:// バージョンの… を試しました。

これを見ました…

…そしてこれ…

しかし、私の設定は管理インターフェースに表示されているため、これは古いものではなく、設定の組み合わせを正しくする問題だと思います。

これを見ました…

…しかし、管理エリアでは「s3 アップロードバケット」を空にすることができないため、関連しているかどうかはわかりませんでした。また、これは AWS S3 を使用している場合のみのようでした。DO Space にフォルダを作成し、そのフォルダ名を使用してみました。フォルダが存在しない別の名前を使用してみました。どちらも機能しませんでした。

これを見ました…

…しかし、私は専門家からは程遠いため、これには手を出せませんでした。

現時点では、試すアイデアがなく、設定が正しいのか、それとも全く見当違いなのか、よくわかりません。

何か助けていただけると大変助かります。ありがとうございます。

また、DO API の認証情報として以下を試しました。

何に一致させるべきか不明なため、その点も少し混乱しています。

いいえ、そうではありません。UIでS3エンドポイントを設定することはできますが、app.ymlファイルで設定する際には、Digital Oceanの提供のようなS3クローンのみをテストおよび検証しました。

Configure an S3 compatible object storage provider for uploads wikiは多くの人々によって多くの作業が行われたため、それに従うことをお勧めします。

「いいね!」 4

ファルコに先を越されましたが、私が言いたかったのはこういうことです…

いいえ。Configure an S3 compatible object storage provider for uploads に従い、設定を app.yml に記述する必要があります。

bunny.net のような実際の CDN が必要です。Cloudflare ではできないと思います。

「いいね!」 1

ありがとうございます。

app.yml に DISCOURSE_S3 設定のセクションが見当たりません。各行を個別に作成すればよいのでしょうか?それとも、sudo コマンドがその役割を果たすのでしょうか?

これらの sudo コマンドをどこで実行または配置するのか、よくわかりません。追加するために一度だけ実行するコマンドライン項目なのか、それとも常に考慮されるように app.yml に含める必要があるものなのか、はっきりしません。

sudo コマンドは app.yml の領域に含めるべきですか、それとも DISCOURSE_S3 設定行のみですか?


DO Spaces では、DISCOURSE_S3_REGION: を空白のままにしておく必要がありますか?


CDN は必要ですか?トラフィックは非常に少なく、小規模なグループです。可能な限り、設定項目を少なくしたいと考えています。

これ…\n\n\n\n[quote=“Falco, post:1, topic:148916, username:Falco”]

 after_assets_precompile:
    - exec:
        cd: $home
        cmd:
          - sudo -E -u discourse bundle exec rake s3:upload_assets
          - sudo -E -u discourse bundle exec rake s3:expire_missing_assets

[/quote]\n\n…は、…の\n\nhooks:\n\n…セクションの…\n\nafter_code: セクションの後に、# plugins to here の下に配置されますか?

「いいね!」 1

OK. after_assets_precompile を追加しました…

再構築しましたが、S3 のセクションがまだ表示されません。

自分で作成する必要がありますか?
設定はどこに置いても問題ありませんか?

ガイドで述べたように、それらは他の DISCOURSE_ の設定と一緒に env: セクションの下に配置する必要があります。

「いいね!」 2

この問題に対する解決策はありますか?Oracle Cloud Storageを使用しようとした際に、同じエラーが発生しました。

wikiに従ってapp.ymlに設定しました。確実な接続のためにs3cmd manualを使用してみました。しかし、投稿で画像をアップロードしようとすると、同じエラーメッセージが表示されます。

メッセージ(4件報告あり)
ジョブ例外: SSL_connect 戻り値=1 エラー番号=0 peeraddr=134.70.128.1:443 状態=エラー: 証明書の検証に失敗しました(ホスト名不一致)
バックトレース
/usr/local/lib/ruby/3.2.0/net/protocol.rb:46:in `connect_nonblock'
/usr/local/lib/ruby/3.2.0/net/protocol.rb:46:in `ssl_socket_connect'
/usr/local/lib/ruby/3.2.0/net/http.rb:1342:in `connect'
/usr/local/lib/ruby/3.2.0/net/http.rb:1248:in `do_start'
/usr/local/lib/ruby/3.2.0/net/http.rb:1243:in `start'
/usr/local/lib/ruby/3.2.0/delegate.rb:87:in `method_missing'
aws-sdk-core-3.130.2/lib/seahorse/client/net_http/connection_pool.rb:307:in `start_session'
aws-sdk-core-3.130.2/lib/seahorse/client/net_http/connection_pool.rb:100:in `session_for'
aws-sdk-core-3.130.2/lib/seahorse/client/net_http/handler.rb:128:in `session'
aws-sdk-core-3.130.2/lib/seahorse/client/net_http/handler.rb:76:in `transmit'
aws-sdk-core-3.130.2/lib/seahorse/client/net_http/handler.rb:50:in `call'
aws-sdk-core-3.130.2/lib/seahorse/client/plugins/content_length.rb:24:in `call'
aws-sdk-core-3.130.2/lib/seahorse/client/plugins/request_callback.rb:85:in `call'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/s3_signer.rb:132:in `call'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/s3_signer.rb:63:in `call'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/s3_host_id.rb:17:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/xml/error_handler.rb:10:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/transfer_encoding.rb:26:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/helpful_socket_errors.rb:12:in `call'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/s3_signer.rb:110:in `call'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/redirects.rb:20:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/retry_errors.rb:360:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/retry_errors.rb:394:in `retry_request'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/retry_errors.rb:382:in `retry_if_possible'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/retry_errors.rb:371:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/retry_errors.rb:394:in `retry_request'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/retry_errors.rb:382:in `retry_if_possible'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/retry_errors.rb:371:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/retry_errors.rb:394:in `retry_request'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/retry_errors.rb:382:in `retry_if_possible'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/retry_errors.rb:371:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/http_checksum.rb:19:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/endpoint_pattern.rb:30:in `call'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/accelerate.rb:67:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/checksum_algorithm.rb:136:in `call'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/bucket_dns.rb:35:in `call'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/dualstack.rb:41:in `call'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/expect_100_continue.rb:22:in `call'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/bucket_name_restrictions.rb:26:in `call'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/arn.rb:62:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/rest/handler.rb:10:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/recursion_detection.rb:18:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/user_agent.rb:13:in `call'
aws-sdk-core-3.130.2/lib/seahorse/client/plugins/endpoint.rb:47:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/param_validator.rb:26:in `call'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/arn.rb:88:in `call'
aws-sdk-core-3.130.2/lib/seahorse/client/plugins/raise_response_errors.rb:16:in `call'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/sse_cpk.rb:24:in `call'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/dualstack.rb:27:in `call'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/accelerate.rb:56:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/checksum_algorithm.rb:111:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/jsonvalue_converter.rb:22:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/idempotency_token.rb:19:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/param_converter.rb:26:in `call'
aws-sdk-core-3.130.2/lib/seahorse/client/plugins/request_callback.rb:71:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/response_paging.rb:12:in `call'
aws-sdk-core-3.130.2/lib/seahorse/client/plugins/response_target.rb:24:in `call'
aws-sdk-core-3.130.2/lib/seahorse/client/request.rb:72:in `send_request'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/client.rb:10921:in `put_bucket_policy'
/var/www/discourse/lib/s3_inventory.rb:183:in `update_bucket_policy'
/var/www/discourse/app/jobs/regular/update_s3_inventory.rb:16:in `block in execute'
/var/www/discourse/app/jobs/regular/update_s3_inventory.rb:14:in `each'
/var/www/discourse/app/jobs/regular/update_s3_inventory.rb:14:in `execute'
/var/www/discourse/app/jobs/base.rb:292:in `block (2 levels) in perform'
rails_multisite-5.0.0/lib/rails_multisite/connection_management.rb:82:in `with_connection'
/var/www/discourse/app/jobs/base.rb:279:in `block in perform'
/var/www/discourse/app/jobs/base.rb:275:in `each'
/var/www/discourse/app/jobs/base.rb:275:in `perform'
sidekiq-6.5.12/lib/sidekiq/processor.rb:202:in `execute_job'
sidekiq-6.5.12/lib/sidekiq/processor.rb:170:in `block (2 levels) in process'
sidekiq-6.5.12/lib/sidekiq/middleware/chain.rb:177:in `block in invoke'
/var/www/discourse/lib/sidekiq/pausable.rb:134:in `call'
sidekiq-6.5.12/lib/sidekiq/middleware/chain.rb:179:in `block in invoke'
sidekiq-6.5.12/lib/sidekiq/middleware/chain.rb:182:in `invoke'
sidekiq-6.5.12/lib/sidekiq/processor.rb:169:in `block in process'
sidekiq-6.5.12/lib/sidekiq/processor.rb:136:in `block (6 levels) in dispatch'
sidekiq-6.5.12/lib/sidekiq/job_retry.rb:113:in `local'
sidekiq-6.5.12/lib/sidekiq/processor.rb:135:in `block (5 levels) in dispatch'
sidekiq-6.5.12/lib/sidekiq.rb:44:in `block in <module:Sidekiq>'
sidekiq-6.5.12/lib/sidekiq/processor.rb:131:in `block (4 levels) in dispatch'
sidekiq-6.5.12/lib/sidekiq/processor.rb:263:in `stats'
sidekiq-6.5.12/lib/sidekiq/processor.rb:126:in `block (3 levels) in dispatch'
sidekiq-6.5.12/lib/sidekiq/job_logger.rb:13:in `call'
sidekiq-6.5.12/lib/sidekiq/processor.rb:125:in `block (2 levels) in dispatch'
sidekiq-6.5.12/lib/sidekiq/job_retry.rb:80:in `global'
sidekiq-6.5.12/lib/sidekiq/processor.rb:124:in `block in dispatch'
sidekiq-6.5.12/lib/sidekiq/job_logger.rb:39:in `prepare'
sidekiq-6.5.12/lib/sidekiq/processor.rb:123:in `dispatch'
sidekiq-6.5.12/lib/sidekiq/processor.rb:168:in `process'
sidekiq-6.5.12/lib/sidekiq/processor.rb:78:in `process_one'
sidekiq-6.5.12/lib/sidekiq/processor.rb:68:in `run'
sidekiq-6.5.12/lib/sidekiq/component.rb:8:in `watchdog'
sidekiq-6.5.12/lib/sidekiq/component.rb:17:in `block in safe_thread'

前もって感謝します!

追伸:Oracle Cloud Serviceだけでなく、他の国内サービスプロバイダーでも同様です。

それで、バケット名を間違ってアクセスしているのかもしれませんね。

どのバケットプロバイダーを使用していますか?

上記で説明したように、Oracle Cloud Storage を試しています。また、同じアカウントで s3cmd ツールを使用して手動で確認しました。

コピー&ペーストなので、名前を間違えることはありません。

S3 エンドポイントの DNS を確認します。

dig axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com

;; <<>> DiG 9.18.18-0ubuntu0.22.04.1-Ubuntu <<>> axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63008
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com. IN A

;; ANSWER SECTION:
axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com. 258 IN CNAME compat.objectstorage.ap-singapore-1.oci.oraclecloud.com.
compat.objectstorage.ap-singapore-1.oci.oraclecloud.com. 258 IN	CNAME objectstorage.ap-singapore-1.oci.oraclecloud.com.
objectstorage.ap-singapore-1.oci.oraclecloud.com. 174 IN A 134.70.128.1

;; AUTHORITY SECTION:
ap-singapore-1.oci.oraclecloud.com. 258	IN SOA	ns1.p200.dns.oraclecloud.net. hostmaster.ap-singapore-1.oci.oraclecloud.com. 682052 3600 900 31536000 1800

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Sat Nov 04 18:58:03 +07 2023
;; MSG SIZE  rcvd: 252

そして、元の名前 axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com の代わりに、ターゲットアドレス objectstorage.ap-singapore-1.oci.oraclecloud.com を使用します。

すると、Discourse が表示するのとまったく同じエラーメッセージが s3cmd ツールで表示されます。

Please wait, attempting to list all buckets...
ERROR: Test failed: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Hostname mismatch, certificate is not valid for 'objectstorage.ap-singapore-1.oci.oraclecloud.com'. (_ssl.c:1007)

この問題については経験がありません。 :frowning:

問題は以下の点にある可能性があります。

この問題を解決する方法はありますか?よろしくお願いします!

証明書に一致する名前を使用してください。

何度も試しましたが、同じエラーメッセージが表示されます。証明書とホスト名を手動で確認し、正しい証明書を正確な形式で取得しましたが、うまくいきませんでした。

私のエンドポイント: <namespace>.<region>.compat.objectstorage.oraclecloud.com
証明書の CN: *.compat.objectstorage.<region>.oraclecloud.com

s3cmd ツールでは接続できます。しかし、同じ設定で Discourse の S3 アップロードを設定できませんでした。

エラーメッセージ: SSL_connect returned=1 errno=0 peeraddr=134.70.128.1:443 state=error: certificate verify failed (Hostname mismatch)

Ruby 環境で設定することで、別の方法を試したいと思います(あらゆる場所を検索しました)。

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

しかし、これを Discourse でどのように設定できますか?お願いします!

これは、X509証明書が提供する多くの保護を損なうため、悪い考えです。

ここでの非秘密設定を教えていただけますか?ご注意ください Oracle Cloudはサポートされていませんが、明らかに間違っている点がないか簡単に確認します。

はい、オフにしたときはその通りです。Rubyライブラリのエラーであれば、PRを作成する理由を見つけたいだけです。

私の設定は非常にシンプルで、画像をS3互換ストレージにアップロードしようとしています。

  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: <region>
  DISCOURSE_S3_ENDPOINT: https://<namespace>.compat.objectstorage.<region>.oraclecloud.com
  DISCOURSE_S3_ACCESS_KEY_ID: <access_key_id>
  DISCOURSE_S3_SECRET_ACCESS_KEY: <access_key>
  DISCOURSE_S3_BUCKET: <bucket_name>

Oracle Cloud Storageには、エンドポイントアドレスの形式があります。しかし、試した形式に関係なく、上記で示したのと同じエラーメッセージが表示されます。

SSL_connect returned=1 errno=0 peeraddr=134.70.128.1:443 state=error: certificate verify failed (Hostname mismatch)

上記の設定では、証明書を確認しましたが、私の目には正しいように見えます。

前述したように、この設定を使用してs3cmdツールで正常に接続できました。どうもありがとうございます!

binding.pryssl_socket_connect の先頭に追加して、これらの設定を使用しようとしたときに表示されるのは次のとおりです。

→ DISCOURSE_USE_S3=true DISCOURSE_S3_REGION=ap-singapore-1 DISCOURSE_S3_ENDPOINT=https://axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com DISCOURSE_S3_ACCESS_KEY_ID=foo DISCOURSE_S3_SECRET_ACCESS_KEY=bar DISCOURSE_S3_BUCKET=bucketname bin/rails c
Loading development environment (Rails 7.0.7)
[1] pry(main)› s3 = S3Helper.build_from_config; s3.list

From: /home/michael/.rvm/gems/ruby-3.2.2@discourse/gems/net-protocol-0.2.2/lib/net/protocol.rb:42 Net::Protocol#ssl_socket_connect:

    40: def ssl_socket_connect(s, timeout)
    41:   binding.pry
 => 42:   if timeout
    43:     while true
    44:       raise Net::OpenTimeout if timeout <= 0
    45:       start = Process.clock_gettime Process::CLOCK_MONOTONIC
    46:       # to_io is required because SSLSocket doesn't have wait_readable yet
    47:       case s.connect_nonblock(exception: false)
    48:       when :wait_readable; s.to_io.wait_readable(timeout)
    49:       when :wait_writable; s.to_io.wait_writable(timeout)
    50:       else; break
    51:       end
    52:       timeout -= Process.clock_gettime(Process::CLOCK_MONOTONIC) - start
    53:     end
    54:   else
    55:     s.connect
    56:   end
    57: end

[1] pry(#<Net::HTTP>)› s.hostname
=> "bucketname.axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com"

したがって、実際に接続されている ホスト名bucketname.axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com であり、これは *.compat.objectstorage.ap-singapore-1.oraclecloud.com と一致しないため、エラーは正しいです。

残念ながら、OCI はこのスタイルのアクセスをサポートしていません。

アプリケーションでパスベースのアクセスを使用してください。仮想ホスト スタイルのアクセス(バケットを {bucketnamespace}.compat.objectstorage.{region}.oraclecloud.com [ママ] としてアクセスすること)はサポートされていません。

逆に、Discourse は仮想ホスト スタイルのアクセス ({bucketname}.{namespace}.compat.objectstorage.{region}.oraclecloud.com.)のみをサポートしています。

以前は機能した可能性のある設定を削除しました。これは、あまりサポートされていなかったためです(コミットメッセージを参照)。

これを機能させるには、このサポートを追加するために複雑な開発とテストが必要であり、簡単ではありません。

注意が必要です。

(xref: S3 Path Style Access)

「いいね!」 4

非常に分かりやすく説明されています。どうもありがとうございました!

「いいね!」 1

ありがとうございます。しかし、結局解決できませんでした。

彼が言っていたものを見つけましたが、テキストをコピー&ペーストすると大文字と小文字が反転してしまいます。諦めて、そのままにしておきました。来年また試してみるかもしれません。

その間に誰かが解決して、私の計画に合わせてセットアップをより良く文書化してくれることを願っていました。

とにかく、ありがとうございました。

この問題が発生していましたが、解決しました。私の解決策は、設定時にメールサーバーがSSL検証されていなかったことですが、ドメインプロバイダーからSSL検証済みのメールサーバーが提供されていたため、それと交換しました。