首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Puma的Localhost通配符SSL

使用Puma的Localhost通配符SSL
EN

Stack Overflow用户
提问于 2020-03-28 21:45:09
回答 1查看 813关注 0票数 1

我有一个带有Puma 4.3的Rails 6.0应用程序。我需要使用自定义域设置通配符SSL证书。我看过很多不同的资源,但我似乎不能让任何东西正常工作。我看到的大多数东西都是为非通配符的设置服务的。

这是我的config/puma.rb。我已经尝试过当前的配置以及注释掉的内容。

代码语言:javascript
运行
复制
##
# Configure Puma server

require 'fileutils'
workers Integer(ENV.fetch('WEB_CONCURRENCY', 2))
threads_count = Integer(ENV.fetch('MAX_THREADS', 5))
threads threads_count, threads_count

key  = %w[. config ssl myapp-local.com.key].join('/')
crt = %w[. config ssl myapp-local.com.crt].join('/')
ssl_bind '127.0.0.1', '9292', {
  key:         key,
  cert:        crt,
  verify_mode: :peer
}
# if ENV['ENVIRONMENT'] == 'development'
#   unless File.exist?(key)
#     def generate_root_cert(root_key)
#       root_ca = OpenSSL::X509::Certificate.new
#       root_ca.version = 2 # cf. RFC 5280 - to make it a "v3" certificate
#       root_ca.serial = 0x0
#       root_ca.subject = OpenSSL::X509::Name.parse "/C=BE/O=A1/OU=A/CN=*.myapp-local.com"
#       root_ca.issuer = root_ca.subject # root CA's are "self-signed"
#       root_ca.public_key = root_key.public_key
#       root_ca.not_before = Time.now
#       root_ca.not_after = root_ca.not_before + 2 * 365 * 24 * 60 * 60 # 2 years validity
#
#       root_ca.sign(root_key, OpenSSL::Digest::SHA256.new)
#       root_ca
#     end
#
#     root_key = OpenSSL::PKey::RSA.new(2048)
#     file = File.new(key, "wb")
#     file.write(root_key)
#     file.close
#
#     root_cert = generate_root_cert(root_key)
#
#     file = File.new(cert, "wb")
#     file.write(root_cert)
#     file.close
#   end
#
#   ssl_bind '127.0.0.1', '9292', {
#     key:         key,
#     cert:        cert,
#     verify_mode: :peer
#   }
#
#   puts "Using local SSL cert..."
# end

preload_app!

rackup      DefaultRackup
port        ENV.fetch('PORT', 3000)
environment ENV.fetch('RACK_ENV', 'development')

on_worker_boot do
    ##
    # Force Scout Agent launch. Required because of use of nginx in Procfile
    ScoutApm::Agent.instance.start_background_worker
end

on_worker_fork { FileUtils.touch('/tmp/app-initialized') }

我在用foreman。这是我的Procfile.dev

代码语言:javascript
运行
复制
redis: (ps aux | grep 6379 | grep redis | awk '{ print $2 }' | xargs kill -s SIGINT) && redis-server --port 6379
resque: rake resque:workers QUEUE='*' COUNT='5'
scheduler: rake resque:scheduler
web: puma

然后在/etc/hosts中我有:

代码语言:javascript
运行
复制
127.0.0.1   localhost
255.255.255.255 broadcasthost
::1             localhost
127.0.0.1 app.myapp-local.com

当我去https://app.myapp-local.com:3000时,我会从Chrome那里得到一个ERR_SSL_PROTOCOL_ERROR错误。

我还尝试手动生成证书,如下所示:

代码语言:javascript
运行
复制
name=myapp-local.com
openssl req \
  -new \
  -newkey rsa:2048 \
  -sha256 \
  -days 3650 \
  -nodes \
  -x509 \
  -keyout $name.key \
  -out $name.crt \
  -config <(cat <<-EOF
  [req]
  distinguished_name = req_distinguished_name
  x509_extensions = v3_req
  prompt = no
  [req_distinguished_name]
  CN = $name
  [v3_req]
  keyUsage = keyEncipherment, dataEncipherment
  extendedKeyUsage = serverAuth
  subjectAltName = @alt_names
  [alt_names]
  DNS.1 = $name
  DNS.2 = *.$name
EOF
)

mv myapp-local.com.crt myapp-local.com.key config/ssl
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain config/ssl/myapp-local.com.crt

我的想法已经用完了。由于应用程序的配置方式,我不能使用不同的主机名(例如lvh.me或localhost),所以我需要它与*.myapp-local.com:3000一起工作。任何帮助都是非常感谢的!

更新

因此,我更改了配置文件如下:

代码语言:javascript
运行
复制
if ENV['ENVIRONMENT'] == 'development'
  key  = %w[. config ssl myapp-local.com.key].join('/')
  crt  = %w[. config ssl myapp-local.com.pem].join('/')
  ca   = "/Users/Daniel Bonnell/Library/Application\ Support/Certificate\ Authority/myapp/myapp.certAuthorityConfig"

  ssl_bind '127.0.0.1', '3000', {
    key:         key,
    cert:        crt,
    ca:          ca,
    verify_mode: :peer
  }
end

现在,当我启动应用程序时,我在日志中看到了以下内容:

代码语言:javascript
运行
复制
17:12:45 web.1 | [68495] * Listening on ssl://127.0.0.1:3000?cert=./config/ssl/myapp-local.com.pem&key=./config/ssl/myapp-local.com.key&verify_mode=peer&no_tlsv1=false&no_tlsv1_1=false&ca=/Users/Daniel Bonnell/Library/Application Support/Certificate Authority/myapp/myapp.certAuthorityConfig
17:12:45 web.1 | [68495] * Listening on tcp://0.0.0.0:5300

如果我转到https://app.myapp-local.com:3000,我会看到以下错误:

代码语言:javascript
运行
复制
17:14:19 web.1 | 2020-03-28 17:14:19 -0500: SSL error, peer: 127.0.0.1, peer cert: /O=member: F4B00436-9C90-4941-B053-A83BCB633934 DD31B694-6F02-4C8D-98C2-640DABBEB3F8/CN=member: F4B00436-9C90-4941-B053-A83BCB633934 DD31B694-6F02-4C8D-98C2-640DABBEB3F8, #<Puma::MiniSSL::SSLError: OpenSSL certificate verification error: unable to get local issuer certificate - 20>

如果我转到https://app.myapp-local.com:5300,我会看到以下错误:

代码语言:javascript
运行
复制
17:15:32 web.1 | 2020-03-28 17:15:32 -0500: HTTP parse error, malformed request (): #<Puma::HttpParserError: Invalid HTTP format, parsing fails.>

我按照这些步骤使用mkcert生成证书,然后在密钥链(MacOS)中设置本地CA。

EN

回答 1

Stack Overflow用户

发布于 2020-03-29 00:49:12

我设法使我的设置正常工作。我想有两个问题。首先,我将SSL绑定到端口3000,然后再向下绑定Puma到端口3000。我把port ENV.fetch('PORT', 3000)改成了port ENV.fetch('PORT', 3001)。第二,我指向错误的CA。下面的设置现在似乎适用于我。我可以访问我的应用程序的端口3000,我不再看到那个讨厌的SSL错误。希望这能帮上忙。我花了10个小时才弄清楚。

代码语言:javascript
运行
复制
##
# Configure Puma server

require 'fileutils'
workers Integer(ENV.fetch('WEB_CONCURRENCY', 2))
threads_count = Integer(ENV.fetch('MAX_THREADS', 5))
threads threads_count, threads_count

# Note: Must generate an SSL certificate for local use.
# See: https://blog.filippo.io/mkcert-valid-https-certificates-for-localhost/
if ENV['ENVIRONMENT'] == 'development'
  key  = File.expand_path('./config/ssl/local_key.pem')
  crt  = File.expand_path('./config/ssl/local_cert.pem')
  ca   = File.expand_path('~/Library/Application Support/mkcert/rootCA.pem')

  ssl_bind '127.0.0.1', 3000, {
    key:         key,
    cert:        crt,
    ca:          ca,
    verify_mode: :peer
  }
end

preload_app!

rackup      DefaultRackup
port        ENV.fetch('PORT', 3001)
environment ENV.fetch('RACK_ENV', 'development')

on_worker_boot do
    ##
    # Force Scout Agent launch. Required because of use of nginx in Procfile
    ScoutApm::Agent.instance.start_background_worker
end

on_worker_fork { FileUtils.touch('/tmp/app-initialized') }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60907375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档