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

Digital Ocean Droplet의 공간이 부족해져서 업로드된 파일을 Digital Ocean Space로 옮기려고 합니다.

현재 다음과 같이 설정했습니다…

  • s3 access key id - DO CP > API > Applications & API에서 복사

  • s3 secret access key - DO CP > API > Applications & API에서 복사

  • s3 region - DO Spaces의 경우 중요하지 않을 것 같아 기본값인 US East (N. Virginia)로 유지

  • s3 upload bucket - Space에 폴더를 생성해야 하는지 확실하지 않습니다. 두 가지 모두 시도해 보았지만…

    • uploads - Space에 이미 생성된 폴더가 없는 경우
    • files - Space에 이미 생성된 폴더가 있는 경우
  • s3 endpoint - 여기에서 설정이 잘못된 것 같습니다. 다음 https:// 버전들을 시도해 보았습니다…

    • ouralias.nyc3.digitaloceanspaces.com - DO Origin Endpoint URL

    • ourdomain.com
      ○ uploads.ourdomain.com을 Cloudflare에서 ours.nyc3.digitaloceanspaces.com의 별칭으로 설정했습니다. DO Domains에서는 d.ourdomain.com만 설정되어 있고 uploads.ourdomain.com은 설정할 수 없어서 그렇게 했습니다.
      ○ 이미지 업로드 시 오류 발생… Malformed request

    • d.ourdomain.com (Discourse가 서브도메인 아래에 있음)
      ○ DO CP > Networking > Domains와 Cloudflare 모두에서 ours.nyc3.digitaloceanspaces.com의 별칭으로 설정했습니다.
      ○ 이미지 업로드 시 오류 발생… Failed to open TCP connection to uploads.d.ourdomain.com:443 (getaddrinfo: Name or service not known)

    • uploads.d.ourdomain.com (3단계 서브도메인이라 보안이 되지 않는다고 표시됨) DO CP > Networking > Domains와 Cloudflare 모두에서 ours.nyc3.digitaloceanspaces.com의 별칭으로 설정했습니다.
      ○ Total TLS error messages · Cloudflare SSL/TLS docs
      ○ 이미지 업로드 시 오류 발생… Failed to open TCP connection to uploads.d.ourdomain.com:443 (getaddrinfo: Name or service not known)

다음 내용을 확인했습니다…

그리고 이것도…

하지만 관리자 인터페이스에 설정이 표시되므로, 이는 오래된 정보가 아니라 단순히 설정 조합을 올바르게 찾는 문제일 것 같습니다.

다음 내용도 확인했습니다…

…하지만 관리자 영역에서 "s3 upload bucket"을 비워 둘 수 없기 때문에 이것이 관련이 있는지 확실하지 않았습니다. 또한 AWS S3를 사용하는 경우에만 해당되는 것처럼 보였습니다. DO Space에 폴더를 생성하고 그 폴더 이름을 사용해보기도 했고, 필요하면 자체적으로 생성되도록 존재하지 않는 다른 폴더 이름을 사용해보기도 했습니다. 하지만 아무것도 작동하지 않았습니다.

다음 내용도 확인했습니다…

https://meta.discourse.org/t/secure-uploads/meta/140017

…하지만 저는 전문가가 아니므로 이 방법은 피했습니다.

이 시점에서 더 이상 시도해 볼 아이디어가 없으며, 제가 근접해서 올바른 설정 구성만 필요한 것인지, 아니면 완전히 방향을 잘못 잡아 전혀 근접하지도 않은 것인지 확신이 서지 않습니다.

도움 주시면 감사하겠습니다. 감사합니다.

또한, DO API 자격 증명을 다음과 같이 시도해 보았습니다.

무엇과 일치해야 하는지 확실하지 않아서 이 부분에서도 조금 혼란스럽습니다.

아니요, 그렇지 않습니다. UI에서 S3 엔드포인트를 구성할 수는 있지만, app.yml 파일에서 구성할 때만 Digital Ocean의 서비스와 같은 S3 클론을 사용하여 테스트하고 검증했습니다.

업로드용 S3 호환 객체 저장소 프로바이더 구성하기 위키는 많은 사람들의 노력으로 작성되었으므로, 해당 가이드를 따르시는 것을 권장합니다.

음, Falco가 먼저 말해버렸지만, 내가 하려던 말은 이렇습니다…

아니요. Configure an S3 compatible object storage provider for uploads 를 따르고 설정을 app.yml 파일에 입력해야 합니다.

bunny.net와 같은 실제 CDN이 필요합니다. Cloudflare로는 불가능할 것 같습니다.

감사합니다.

app.yml에서 DISCOURSE_S3 설정을 위한 섹션을 찾지 못했습니다. 각 항목별로 한 줄씩 직접 만들어야 하나요? 아니면 그 sudo 명령어가 그런 역할을 하는 건가요?

그 sudo 명령어를 어디서 실행하거나 어디에 배치해야 하는지 정확히 이해하지 못하겠습니다. 한 번만 실행하는 명령줄 항목으로 추가하는 것인지, 아니면 항상 적용되도록 app.yml에 넣어야 하는 것인지 명확하지 않습니다.

sudo 명령어는 app.yml 영역에 넣어야 하는 건가요, 아니면 DISCOURSE_S3 설정 라인만 넣으면 되는 건가요?


DO Spaces를 사용하는 경우 DISCOURSE_S3_REGION은 그냥 비워둬도 되나요?


CDN이 꼭 필요한가요? 트래픽이 매우 적고 소규모 그룹입니다. 가능하다면 변경 요소(moving parts)를 최소화하고 싶습니다.

이것은…

…이 부분은 …

hooks:

… 영역의 # plugins to here 아래, …

after_code: 섹션 뒤에 위치해야 하나요?

OK. after_assets_precompile을 추가했습니다…

다시 빌드해 보았지만 여전히 S3 섹션이 보이지 않습니다.

직접 만들어야 하나요?
설정을 어디에 두는 것이 중요한가요?

가이드에서 언급했듯이, 다른 DISCOURSE_ 관련 설정과 함께 env: 섹션 아래에 배치해야 합니다:

이 문제에 대한 해결책이 있을까요? Oracle Cloud Storage를 사용하려고 할 때 동일한 오류가 발생했습니다.

위키에 따라 app.yml에 설정을 적용했습니다. 연결이 확실하게 올바른지 확인하기 위해 s3cmd 수동 명령도 시도해 보았습니다. 하지만 게시물에 이미지를 업로드할 때 동일한 오류 메시지가 나타났습니다.

Message (4 copies reported)
Job exception: SSL_connect returned=1 errno=0 peeraddr=134.70.128.1:443 state=error: certificate verify failed (Hostname mismatch)
Backtrace
/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' 

미리 감사드립니다!

P.S. 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)를 사용했습니다.

그러면 s3cmd 도구에서 Discourse가 표시한 것과 동일한 오류 메시지가 나타났습니다:

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:

문제가 다음에서 비롯되었을 수 있습니다:

이 문제를 해결할 방법이 있을까요? 감사합니다!

인증서와 일치하는 이름을 사용하세요.

여러 번 시도해 보았지만 여전히 동일한 오류 메시지가 표시됩니다. 수동으로 인증서와 호스트 이름을 확인했고, 눈으로 올바른 형식을 사용하여 올바른 인증서를 선택했지만 실패했습니다.

제 엔드포인트: .compat.objectstorage..oraclecloud.com
인증서의 CN: *.compat.objectstorage..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 도구를 통해 정상적으로 연결했습니다. 정말 감사합니다!

OK, ssl_socket_connect의 시작 부분에 binding.pry를 추가했는데, 이 설정을 사용하려고 할 때 다음을 확인했습니다:

→ 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는 이러한 스타일의 접근을 지원하지 않습니다:

애플리케이션에서 경로 기반(path-based) 접근을 사용하십시오. 버추얼 호스트 스타일 접근(버킷을 {bucketnamespace}.compat.objectstorage.{region}.oraclecloud.com으로 접근하는 방식 [원문 그대로])은 지원되지 않습니다.

반대로 Discourse는 버추얼 호스트 스타일 접근({bucketname}.{namespace}.compat.objectstorage.{region}.oraclecloud.com.)만 지원합니다.

우리는 얼마 전 이 접근 방식을 작동하게 만들 수 있었을 설정을 제거했는데, 이는 잘 지원되지 않았기 때문이었습니다(커밋 메시지를 참고하십시오).

이를 작동시키는 것은 간단하지 않을 것이며, 이 지원을 추가하려면 복잡한 개발과 테스트가 필요합니다.

여기에는 용(드래곤)이 있습니다.(복잡하고 위험한 부분이 있다는 뜻)

(xref: S3 Path Style Access)

매우 명확하게 설명해 주셨습니다. 정말 감사합니다!

감사합니다만, 결국 해결하지 못했습니다.

그가 언급한 것을 찾았지만, 텍스트를 복사해서 붙여넣으면 대소문자가 반대로 바뀌더라고요. 그래서 포기하고 다시 건드리지 않았습니다. 내년에는 다시 시도해 볼지도 모르겠습니다.

그 사이 누군가가 해결해서 제 계획에 맞게 설정을 더 잘 문서화해 주기를 바랐습니다.

어쨌든 감사합니다.

저도 같은 문제를 겪고 있었는데, 이렇게 해결했습니다. 제 해결 방법은 다음과 같습니다. 설정을 했을 때 제 메일 서버는 SSL 인증이 되어 있지 않았지만, 도메인 제공업체가 SSL 인증된 메일 서버를 제공해 주었기 때문에 그걸로 교체했습니다.