On Tue, 30 Nov 2021 22:31:11 +0100 Łukasz Moskała <[email protected]> wrote:
> W dniu 30.11.2021 o 16:07, Radek pisze: > > On Tue, 30 Nov 2021 10:04:30 +0100 > > Łukasz Moskała <[email protected]> wrote: > > > >> > >> > >> Dnia 30 listopada 2021 09:45:15 CET, Radek <[email protected]> napisał/a: > >>> On Mon, 29 Nov 2021 11:19:28 +0100 > >>> Łukasz Moskała <[email protected]> wrote: > >>> > >>>> W dniu 28.11.2021 o 18:07, Radek pisze: > >>>>> Hello, > >>>>> following the official guide [1] and few others webites I finally > >>>>> installed my first Ruby on Rails/Puma web app... and it passed the > >>>>> local test by curl (bundle exec rails server webrick -e production) - > >>>>> relayd wasn't configured yet. > >>>>> > >>>>> Then, I ran my app with puma server. I can't figure out how to make it > >>>>> work with FQDN and LetsEncrypt cert. > >>>>> My configs seems to be fine. It's 7.0/amd64. I've read [2], [3]. > >>>>> > >>>>> I started with simple httpd configuration to get certs with acme-clinet > >>>>> and then https://redmine.MY.DOMAIN.COM showed my testing index.html > >>>>> properly. > >>>>> Now /etc/httpd.conf has changed but I assume my certs are still OK. > >>>>> > >>>>> Remote firefox is giving me a "Redirect Loop" error when trying to > >>>>> access https://redmine.MY.DOMAIN.COM > >>>>> > >>>>> Could someone please shed some light on this puzzle? > >>>>> > >>>>> 1. https://www.redmine.org/projects/redmine/wiki/RedmineInstall > >>>>> 2. https://github.com/basicfeatures/openbsd-rails > >>>>> 3. > >>>>> https://gist.github.com/anon987654321/4532cf8d6c59c1f43ec8973faa031103 > >>>>> > >>>>> $ openssl s_client -connect redmine.MY.DOMAIN.COM:443 > >>>>> CONNECTED(00000003) > >>>>> depth=0 CN = redmine.MY.DOMAIN.COM > >>>>> verify error:num=20:unable to get local issuer certificate > >>>>> verify return:1 > >>>>> depth=0 CN = redmine.MY.DOMAIN.COM > >>>>> verify error:num=21:unable to verify the first certificate > >>>>> verify return:1 > >>>>> write W BLOCK > >>>>> --- > >>>>> Certificate chain > >>>>> 0 s:/CN=redmine.MY.DOMAIN.COM > >>>>> i:/C=US/O=Let's Encrypt/CN=R3 > >>>>> --- > >>>>> Server certificate > >>>>> -----BEGIN CERTIFICATE----- > >>>>> [...] > >>>>> -----END CERTIFICATE----- > >>>>> subject=/CN=redmine.MY.DOMAIN.COM > >>>>> issuer=/C=US/O=Let's Encrypt/CN=R3 > >>>>> --- > >>>>> No client certificate CA names sent > >>>>> Server Temp Key: ECDH, X25519, 253 bits > >>>>> --- > >>>>> SSL handshake has read 2403 bytes and written 367 bytes > >>>>> --- > >>>>> New, TLSv1/SSLv3, Cipher is AEAD-AES256-GCM-SHA384 > >>>>> Server public key is 4096 bit > >>>>> Secure Renegotiation IS NOT supported > >>>>> Compression: NONE > >>>>> Expansion: NONE > >>>>> No ALPN negotiated > >>>>> SSL-Session: > >>>>> Protocol : TLSv1.3 > >>>>> Cipher : AEAD-AES256-GCM-SHA384 > >>>>> Session-ID: > >>>>> Session-ID-ctx: > >>>>> Master-Key: > >>>>> Start Time: 1638116582 > >>>>> Timeout : 7200 (sec) > >>>>> Verify return code: 21 (unable to verify the first certificate) > >>>>> --- > >>>>> > >>>>> > >>>>> [redminepk@@redmine70~/redminepk:]bundle exec pumactl27 --config-file > >>>>> config/puma.rb start > >>>>> Puma starting in single mode... > >>>>> * Puma version: 5.5.2 (ruby 2.7.4-p191) ("Zawgyi") > >>>>> * Min threads: 0 > >>>>> * Max threads: 5 > >>>>> * Environment: production > >>>>> * PID: 85983 > >>>>> * Listening on > >>>>> ssl://127.0.0.1:3000?cert=/etc/ssl/redmine.MY.DOMAIN.COM.crt&key=/etc/ssl/private/redmine.MY.DOMAIN.COM.key&verify_mode=none > >>>>> * Listening on http://127.0.0.1:3001 > >>>>> Use Ctrl-C to stop > >>>>> > >>>>> > >>>>> > >>>>> > >>>>> # /home/redminepk/redminepk/config/puma.rb > >>>>> #!/usr/bin/env puma > >>>>> app = "redminepk" > >>>>> ssl_bind "127.0.0.1", "3000", { > >>>>> key: "/etc/ssl/private/redmine.MY.DOMAIN.COM.key", > >>>>> cert: "/etc/ssl/redmine.MY.DOMAIN.COM.crt" > >>>>> } > >>>>> bind "tcp://127.0.0.1:3001" > >>>>> pidfile "/home/#{app}/#{app}/tmp/puma.pid" > >>>>> state_path "/home/#{app}/#{app}/tmp/puma.state" > >>>>> stdout_redirect "/home/#{app}/#{app}/log/puma_access.log", > >>>>> "/home/#{app}/#{app}/log/puma_errors.log" > >>>>> environment "production" > >>>>> > >>>>> > >>>>> # /home/redminepk/redminepk/config/environments/production.rb > >>>>> Rails.application.configure do > >>>>> config.cache_classes = true > >>>>> config.eager_load = true > >>>>> config.consider_all_requests_local = false > >>>>> config.action_controller.perform_caching = true > >>>>> config.action_mailer.raise_delivery_errors = false > >>>>> config.action_mailer.logger = nil > >>>>> config.active_support.deprecation = :log > >>>>> config.force_ssl = true > >>>>> end > >>>>> > >>>>> > >>>>> > >>>>> # /etc/httpd.conf > >>>>> ext_if="vmx0" > >>>>> types { include "/usr/share/misc/mime.types" } > >>>>> server "redmine.MY.DOMAIN.COM" { > >>>>> listen on $ext_if port 80 > >>>>> location "/.well-known/acme-challenge/*" { > >>>>> root "/acme" > >>>>> request strip 2 > >>>>> } > >>>>> location "*" { > >>>>> block return 302 "https://$HTTP_HOST$REQUEST_URI" > >>>>> } > >>>>> } > >>>>> > >>>>> > >>>>> # /etc/relayd.conf > >>>>> egress="A.B.C.D" > >>>>> table <redminepk> { 127.0.0.1 } > >>>>> redminepk_port="3001" > >>>>> table <httpd> { 127.0.0.1 } > >>>>> httpd_port="80" > >>>>> http protocol "http" { > >>>>> match request header set "Connection" value "close" > >>>>> match response header remove "Server" > >>>>> } > >>>>> http protocol "https" { > >>>>> pass request header "Host" value "redmine.MY.DOMAIN.COM" forward to > >>>>> <redminepk> > >>>>> tls keypair "redmine.MY.DOMAIN.COM" > >>>>> # Preserve address headers > >>>>> match request header append "X-Forwarded-For" value "$REMOTE_ADDR" > >>>>> match request header append "X-Forwarded-Port" value "$REMOTE_PORT" > >>>>> match request header append "X-Forwaded-By" value > >>>>> "$SERVER_ADDR:$SERVER_PORT" > >>>>> match request header set "Connection" value "close" > >>>>> match response header remove "Server" > >>>>> } > >>>>> relay "http" { > >>>>> listen on $egress port http > >>>>> protocol "http" > >>>>> forward to <httpd> port $httpd_port > >>>>> } > >>>>> relay "https" { > >>>>> listen on $egress port https tls > >>>>> protocol "https" > >>>>> forward to <httpd> port $httpd_port > >>>>> forward to <redminepk> port $redminepk_port > >>>>> } > >>>>> > >>>>> $ grep relayd /etc/pf.conf > >>>>> # Allow relayd(8) redirects > >>>>> anchor "relayd/*" > >>>>> > >>>>> > >>>>> > >>>>> > >>>>> On Fri, 12 Nov 2021 20:35:45 +0100 > >>>>> Radek <[email protected]> wrote: > >>>>> > >>>>>> Hello Werner, > >>>>>> thank you for your installation details. I'll give it a try in a few > >>>>>> days. > >>>>>> > >>>>>> On Thu, 11 Nov 2021 23:57:02 +0800 > >>>>>> Werner Boninsegna <[email protected]> wrote: > >>>>>> > >>>>>>> Hello Radek, > >>>>>>> > >>>>>>> I am running Redmine on OpenBSD 6.8 and I just followed the > >>>>>>> installation > >>>>>>> instructions posted on the Redmine page which are quite complete: > >>>>>>> > >>>>>>> https://www.redmine.org/projects/redmine/wiki/Installation_Guide > >>>>>>> > >>>>>>> I installed Postgres and Ruby+Dependencies from the OpenBSD packages. > >>>>>>> > >>>>>>> Werner > >>>>>>> > >>>>>>> On 11/10/21 00:56, Radek wrote: > >>>>>>> > >>>>>>> Hi @misc, > >>>>>>> Does anyone successfully run redmine[1] on OpenBSD? > >>>>>>> I'd like to install redmine on 7.0/amd64 with httpd and > >>>>>>> postgresql. I've never done it before so any advices and hints would > >>>>>>> be appreciated. > >>>>>>> There isn't much up to date info in google about it[2][3]. > >>>>>>> > >>>>>>> 1. https://www.redmine.org/ 2. > >>>>>>> https://www.redmine.org/boards/2/topics/496 3. > >>>>>>> https://web.archive.org/web/20160406041905/http://www.iwebdev.it/blog/?p=229 > >>>>>>> Thank you! > >>>>>> > >>>>>> > >>>>>> -- > >>>>>> Radek > >>>>>> > >>>>> > >>>>> > >>>> Hi, > >>>> I have never used relayd (only haproxy), so some things that I say may > >>>> be wrong. Sorry about that in advance. > >>>> > >>>> First of all, what's the point of passing http via relayd? > >>>> > >>>> Now, going back to your issue,why do you have > >>>> >forward to <httpd> port $httpd_port > >>>> in relay "https" ? > >>>> > >>>> It looks like relayd may put those requests to httpd, which will > >>>> redirect them to https. > >>>> > >>>> So, I'd start looking at httpd and puma logs, to check to which daemon > >>>> the requests are actually being sent to. > >>>> > >>>> And, if i'm wrong, and requests are going to puma (or whatever is > >>>> listening on 3001), then most likely puma is trying to redirect users to > >>>> https. Possibly because of this line: > >>>> >config.force_ssl = true > >>>> > >>>> Also, in this case you may try setting header x-forwarded-proto to > >>>> https, but I don't know if puma will actually use it. > >>>> > >>>> > >>>> Let us know if that worked. > >>>> > >>>> Kind regards, > >>>> -- > >>>> Łukasz Moskała > >>> Hello Łukasz, > >>> > >>>> First of all, what's the point of passing http via relayd? > >>> I used to think that all http and https traffic have to be passed via > >>> relayd if relayd is started. > >>> I have never used relayd before. > >>> > >>>> Now, going back to your issue,why do you have > >>>> >forward to <httpd> port $httpd_port > >>>> in relay "https" ? > >>> I think it was pasted there by mistake. I removed this line. > >>> > >>>> So, I'd start looking at httpd and puma logs, to check to which daemon > >>>> the requests are actually being sent to. > >>> Unfortunately, there is nothing in httpd and puma logs. > >>> The only logs I have are from relayd (-dvv): > >>> relay https, tls session 1 established (1 active) > >>> relay_tls_transaction: session 2: scheduling on EV_READ > >>> relay https, tls session 2 established (1 active) > >>> relay_tls_transaction: session 3: scheduling on EV_READ > >>> relay https, tls session 3 established (1 active) > >>> [...] > >>> > >>>> And, if i'm wrong, and requests are going to puma (or whatever is > >>>> listening on 3001), then most likely puma is trying to redirect users to > >>>> https. Possibly because of this line: > >>>> >config.force_ssl = true > >>> I suppose it should work this way but I don't know what actually is going > >>> on there between puma and relayd. > >>> > >>>> Also, in this case you may try setting header x-forwarded-proto to > >>>> https, but I don't know if puma will actually use it. > >>> If the below syntax is correct this option doesn't make any change. > >>> match request header set "X-Forwaded-Proto" value "$SERVER_PORT" > >>> > >>> > >> > >> Now, if I think about it again, you can run tcpdump on lo0, and hopefully > >> see what is going on. > >> > >> Also, I feel like in your case, relayd is unnecessary here, as you can run > >> httpd on port 80, for redirecting to https and acme, and then run puma on > >> port 3000, and use pf to NAT traffic coming on vmx0 to EXT_IP port 443 to > >> 127.0.0.1 port 3000. > >> > >> It would look more or less like this (typing on phone from memory, may not > >> be exactly correct): > >> pass in quick on vmx0 inet proto tcp from any to $EXT_IP rdr-to > >> 127.0.0.1:3000 > >> > >> This way http requests will still be served by httpd, and https requests > >> will go straight to puma. > >> > >> I don't think you need to enable ip forwarding for that, but you can try > >> it if it doesn't work. > >> > >> also, you can try going to https://EXT_IP:3000 and http://EXT_IP:3001, to > >> see what will happen. curl -v will probably show more than browsers. > >> > >> -- > >> Łukasz Moskała > > > > I care about configuring it with relayd. It's a good opportunity to learn > > this field. > > If I can't handle it I will try redirecting 443 to puma/localhost with > > httpd and PF. > > > > Going back to case with enabled relayd.. > > curl -v https://redmine.MY.DOMAIN.COM shows: > > * Expire in 0 ms for 6 (transfer 0x5654a296bfb0) > > * Expire in 1 ms for 1 (transfer 0x5654a296bfb0) > > [...] > > * Expire in 15 ms for 1 (transfer 0x5654a296bfb0) > > * Expire in 50 ms for 1 (transfer 0x5654a296bfb0) > > * Trying A.B.C.D... > > * TCP_NODELAY set > > * Expire in 200 ms for 4 (transfer 0x5654a296bfb0) > > * Connected to redmine.MY.DOMAIN.COM (A.B.C.D) port 443 (#0) > > * ALPN, offering h2 > > * ALPN, offering http/1.1 > > * successfully set certificate verify locations: > > * CAfile: none > > CApath: /etc/ssl/certs > > * TLSv1.3 (OUT), TLS handshake, Client hello (1): > > * TLSv1.3 (IN), TLS handshake, Server hello (2): > > * TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8): > > * TLSv1.3 (IN), TLS handshake, Certificate (11): > > * TLSv1.3 (OUT), TLS alert, unknown CA (560): > > * SSL certificate problem: unable to get local issuer certificate > > * Closing connection 0 > > curl: (60) SSL certificate problem: unable to get local issuer certificate > > More details here: https://curl.haxx.se/docs/sslcerts.html > > > > tcpdump -i lo0 shows nothing > > > > > > relayd -dvv shows: > > relay_tls_transaction: session 5: scheduling on EV_READ > > relay_close: sessions inflight decremented, now 0 > > > > > > Curl did connect to relayd, and didn't send any request, because it > didn't accept certificate presented by relayd, so relayd didn't try to > pass this any further. > > It looks like relayd didn't send all intermidiate certificates, thus > curl was not able to find complete trust chain, resulting in this error. > You can deal with it later, for now you can add option -k or --insecure > to curl, to ignore certificate verification. > > Then you could look again in tcpdump, logs, and curl output. > > Again, I think you are really making your life difficult trying to use > relayd. Relayd is supposed to be used as a load-balancer running on a > router, to split traffic between multiple servers, optionally > terminating TLS connection, but in your case there's only one server, so > no need to load-balance, and puma can listen on TLS on it's own, so no > need to terminate TLS connection. > Also it will add you a little bit of overhead, since relayd in layer7 > has to accept the connection, and then relayd opens another connection > to puma. > > -- > Łukasz Moskała Ok, I need to run Redmine ASAP so I give up with relayd configuration. Puma seems to work fine with port redirecting [1], but there is also one issue with ssl key permission. I run the redmine app as a normal user so puma can't read the /etc/ssl/private/redmine.MY.DOMAIN.COM.key (default perm 400). The website doesn't load on Firefox (PR_END_OF_FILE_ERROR) and Puma shows error: 2021-12-06 04:40:55 +0100 SSL error, peer: A.B.C.D, peer cert: : #<Puma::MiniSSL::SSLError: OpenSSL error: error:14FFF0A8:SSL routines:(UNKNOWN)SSL_internal:missing rsa certificate - 168> $ curl -k https://redmine.MY.DOMAIN.COM curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to redmine.MY.DOMAIN.COM:443 If I change perm /etc/ssl/private/redmine.MY.DOMAIN.COM.key to 555 website loads on FF correctly (no errors on puma) but I still got an error on curl: $ curl https://redmine.MY.DOMAIN.COM curl: (35) error:1404B418:SSL routines:ST_CONNECT:tlsv1 alert unknown ca puma also shows error on curl request: 2021-12-06 05:04:06 +0100 SSL error, peer: A.B.C.D, peer cert: : #<Puma::MiniSSL::SSLError: OpenSSL error: error:1403F418:SSL routines:ACCEPT_SR_FINISHED:tlsv1 alert unknown ca - 1048> curl -k loads the page and puma doesn't show any errors. If I have ssl key permission set to 555 I also got an error from acme client: $ acme-client -v redmine.MY.DOMAIN.COM acme-client: /etc/ssl/private/redmine.MY.DOMAIN.COM.key: group read/writable or world read/writable Did I miss any obvious thing? I'm not sure if running the app as root to solve the ssl key permission problem is a goor idea... 1. pass in quick inet proto tcp from any to egress port 80 pass in quick on egress inet proto tcp from any rdr-to 127.0.0.1 port 3000 -- Radek

