mirror of
https://github.com/neocities/neocities.git
synced 2025-04-25 01:32:36 +02:00
simplify letsencrypt code for now, merge into single async worker
This commit is contained in:
parent
e1c69dbc13
commit
9ef69854ca
4 changed files with 38 additions and 50 deletions
|
@ -152,10 +152,3 @@ end
|
||||||
gandi_opts = {}
|
gandi_opts = {}
|
||||||
gandi_opts[:env] = :test unless ENV['RACK_ENV'] == 'production'
|
gandi_opts[:env] = :test unless ENV['RACK_ENV'] == 'production'
|
||||||
$gandi = Gandi::Session.new $config['gandi_api_key'], gandi_opts
|
$gandi = Gandi::Session.new $config['gandi_api_key'], gandi_opts
|
||||||
|
|
||||||
# Let's Encrypt
|
|
||||||
|
|
||||||
$letsencrypt = Acme::Client.new(
|
|
||||||
private_key: OpenSSL::PKey::RSA.new(File.read($config['letsencrypt_key'])),
|
|
||||||
endpoint: $config['letsencrypt_endpoint']
|
|
||||||
)
|
|
|
@ -1330,28 +1330,6 @@ class Site < Sequel::Model
|
||||||
sanitized.gsub(/(http|https):\/\//, '').gsub(/[^\w\s]/, '').downcase.split.uniq.select{|v| v.length < SiteFile::CLASSIFIER_WORD_LIMIT}.join(' ')
|
sanitized.gsub(/(http|https):\/\//, '').gsub(/[^\w\s]/, '').downcase.split.uniq.select{|v| v.length < SiteFile::CLASSIFIER_WORD_LIMIT}.join(' ')
|
||||||
end
|
end
|
||||||
|
|
||||||
def request_ssl_authorization
|
|
||||||
auth = $letsencrypt.authorize domain: domain
|
|
||||||
challenge = auth.http01
|
|
||||||
FileUtils.mkdir_p File.join(base_files_path, File.dirname(challenge.filename))
|
|
||||||
|
|
||||||
File.write File.join(base_files_path, challenge.filename), challenge.file_content
|
|
||||||
|
|
||||||
challenge.request_verification
|
|
||||||
|
|
||||||
challenge
|
|
||||||
end
|
|
||||||
|
|
||||||
# request_ssl_authorization must be run first!
|
|
||||||
def obtain_ssl_certificate
|
|
||||||
csr = Acme::Client::CertificateRequest.new names: [domain, "www.#{domain}"]
|
|
||||||
certificate = $letsencrypt.new_certificate csr
|
|
||||||
self.ssl_key = certificate.request.private_key.to_pem
|
|
||||||
self.ssl_cert = certificate.fullchain_to_pem
|
|
||||||
save_changes
|
|
||||||
FileUtils.rm_rf File.join(base_files_path, '.well-known')
|
|
||||||
end
|
|
||||||
|
|
||||||
# array of hashes: filename, tempfile, opts.
|
# array of hashes: filename, tempfile, opts.
|
||||||
def store_files(files, opts={})
|
def store_files(files, opts={})
|
||||||
results = []
|
results = []
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
class CreateSSLCertWorker
|
|
||||||
include Sidekiq::Worker
|
|
||||||
sidekiq_options queue: :create_ssl_cert_worker, retry: 100, backtrace: true
|
|
||||||
|
|
||||||
sidekiq_retry_in do |count|
|
|
||||||
180
|
|
||||||
end
|
|
||||||
|
|
||||||
def perform(site_id, challenge)
|
|
||||||
site = Site[site_id]
|
|
||||||
|
|
||||||
challenge = $letsencrypt.challenge_from_hash JSON.parse(challenge)
|
|
||||||
if challenge.verify_status == 'valid'
|
|
||||||
site.obtain_ssl_certificate
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,4 +1,6 @@
|
||||||
class RequestSSLAuthWorker
|
class RequestSSLAuthWorker
|
||||||
|
class NotAuthorizedYetError < StandardError; end
|
||||||
|
class VerificationTimeoutError < StandardError; end
|
||||||
include Sidekiq::Worker
|
include Sidekiq::Worker
|
||||||
sidekiq_options queue: :request_ssl_auth_worker, retry: 100, backtrace: true
|
sidekiq_options queue: :request_ssl_auth_worker, retry: 100, backtrace: true
|
||||||
|
|
||||||
|
@ -7,10 +9,42 @@ class RequestSSLAuthWorker
|
||||||
end
|
end
|
||||||
|
|
||||||
def perform(site_id)
|
def perform(site_id)
|
||||||
site = Site[site_id]
|
letsencrypt = Acme::Client.new(
|
||||||
return if site.domain.blank?
|
private_key: OpenSSL::PKey::RSA.new(File.read($config['letsencrypt_key'])),
|
||||||
challenge = site.request_ssl_authorization
|
endpoint: $config['letsencrypt_endpoint']
|
||||||
|
)
|
||||||
|
|
||||||
CreateSSLCertWorker.perform_in 5.seconds, site_id, challenge.to_h.to_json
|
site = Site[site_id]
|
||||||
|
|
||||||
|
return if site.domain.blank? || site.is_deleted || site.is_banned
|
||||||
|
|
||||||
|
auth = letsencrypt.authorize domain: site.domain
|
||||||
|
|
||||||
|
challenge = auth.http01
|
||||||
|
|
||||||
|
FileUtils.mkdir_p File.join(site.base_files_path, File.dirname(challenge.filename))
|
||||||
|
File.write File.join(site.base_files_path, challenge.filename), challenge.file_content
|
||||||
|
|
||||||
|
challenge.request_verification
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
attempts = 0
|
||||||
|
|
||||||
|
begin
|
||||||
|
raise VerificationTimeoutError if attempts == 5
|
||||||
|
raise NotAuthorizedYet if challenge.verify_status != 'valid'
|
||||||
|
rescue NotAuthorizedYet
|
||||||
|
sleep 5
|
||||||
|
attempts += 1
|
||||||
|
retry
|
||||||
|
end
|
||||||
|
|
||||||
|
csr = Acme::Client::CertificateRequest.new names: [site.domain, "www.#{site.domain}"]
|
||||||
|
certificate = letsencrypt.new_certificate csr
|
||||||
|
site.ssl_key = certificate.request.private_key.to_pem
|
||||||
|
site.ssl_cert = certificate.fullchain_to_pem
|
||||||
|
site.save_changes validate: false
|
||||||
|
FileUtils.rm_rf File.join(site.base_files_path, '.well-known')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Add table
Reference in a new issue