Certbot renew fails

Hello

I had installed BigBlueButton on Ubuntu 18.04.5 LTS. Certbot runs well during the installation routine. But now after 90 days the renew of certificates fails.
I ran this command:
/usr/bin/certbot renew --webroot-path /var/www/html
It produced this output:

    Cleaning up challenges
Attempting to renew cert (bbb.germany.com) from /etc/letsencrypt/renewal/bbb.germany.com.conf produced an unexpected error: Failed authorization procedure. bbb.365.de (http-01): urn:ietf:params:acme:error:unauthorized :: The client lacks sufficient authorization :: Invalid response from https://bbb.germany.com/b [192.109.24.80]: "\n<!DOCTYPE html>\n<html>\n  <head>\n\n    <title>BigBlueButton</title>\n    <meta property=\"og:title\" content=\"BigBlueButton\" />\n    ", bbb.germany.com (http-01): urn:ietf:params:acme:error:unauthorized :: The client lacks sufficient authorization :: Invalid response from https://bbb.germany.com/.well-known/acme-challenge/ium2Lx7aapeoBDH7m7E7oHTMIIpriiDHCzf8cr2FgDw [192.109.24.80]: "<html>\r\n<head><title>404 Not Found</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>404 Not Found</h1></center>\r\n<hr><center>", bbb.schwaben.de (http-01): urn:ietf:params:acme:error:unauthorized :: The client lacks sufficient authorization :: Invalid response from https://bbb.germany.com/b [192.109.24.80]: "\n<!DOCTYPE html>\n<html>\n  <head>\n\n    <title>BigBlueButton</title>\n    <meta property=\"og:title\" content=\"BigBlueButton\" />\n    ". Skipping.
All renewal attempts failed. The following certs could not be renewed:
  /etc/letsencrypt/live/bbb.germany.com/fullchain.pem (failure)

My web server is (include version):
nginx/1.14.0 (Ubuntu)
The operating system my web server runs on is (include version):
Ubuntu 18.04.5 LTS.
My hosting provider, if applicable, is:

I can login to a root shell on my machine (yes or no, or I don't know):
yes
I'm using a control panel to manage my site (no, or provide the name and version of the control panel):
no
The version of my client is (e.g. output of certbot --version or certbot-auto --version if you're using Certbot):
certbot 0.27.0

Do you have some ideas?

Best regards
Kaheto

1 Like

The hostname for bbb.365.de is failing, because it redirects to https://bbb.germany.com without keeping the path intact.

I.e.:

http://bbb.365.de/.well-known/acme-challenge/test SHOULD redirect to https://bbb.germany.com/.well-known/acme-challenge/test for the challenge to work. Instead, it redirects to https://bbb.germany.com without the path.

Also, why are you setting the webroot path explicitely in combination with the renew subcommand?

2 Likes

Thanks for your feedback. I will reflect about your response and answer you tomorrow.

1 Like

Welcome to the Let's Encrypt Community, Kaheto :slightly_smiling_face:

For reference, you can see exactly what @Osiris has mentioned by pasting http://bbb.365.de/.well-known/acme-challenge/test into the box of this tool:

https://www.redirect-checker.org/index.php

1 Like

Hi Griffin,
for understanding your link is useful. At first I generated this path
/var/www/bigbluebutton-default/.well-known/acme-challenge/
So I get a right result at
'https://bbb.365.de/.well-known/acme-challenge/test'
But with 'http://bbb.365.de/.well-known/acme-challenge/test' it still fails.

I don't find the error at:

#server_tokens off;

server {
  listen 80;
  listen [::]:80;
  server_name bbb.365.de;
  
  return 301 https://bbb.germany.com; #redirect HTTP to HTTPS

}
server {
  listen 443 ssl;
  listen [::]:443 ssl;
  server_name bbb.365.de;

    ssl_certificate /etc/letsencrypt/live/bbb.germany.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/bbb.germany.com/privkey.pem;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_protocols TLSv1.2;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers on;
    ssl_dhparam /etc/nginx/ssl/dhp-4096.pem;

#  return 301 https://bbb.germany.com;
  # BigBlueButton landing page.
  location / {
    root   /var/www/bigbluebutton-default;
    index  index.html index.htm;
    expires 1m;
  }
    
  access_log  /var/log/nginx/bigbluebutton.access.log;

  #error_page  404  /404.html;

  # Redirect server error pages to the static page /50x.html
  #
  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   /var/www/nginx-default;
  }
}

Originally it was "return 301 https://bbb.germany.com;" instead of the location directive. And the 301 redirect to bbb.germany.com seems necessary to me. I don't see a 302 or 307 redirect so now I don't know what change to make in the file.

Best regards

Kaheto

1 Like

This will not pass the full request as @Osiris mentioned.

It should be this:

return 301 https://bbb.germany.com$request_uri; #redirect HTTP to HTTPS

The 307 redirect is coming from a port 443 nginx server block for bbb.germany.com, not bbb.365.de.

I'm not exactly sure what you're trying to accomplish with this domain redirection, but I also noticed this:

bbb.365.de. 3599 IN CNAME bbb.germany.com.
bbb.germany.com. 3599 IN A 192.109.24.80

So, out of curiosity, what's the output of this:

sudo nginx -T

1 Like
nginx: [warn] conflicting server name "bbb.365.de" on 0.0.0.0:443, ignored
nginx: [warn] conflicting server name "bbb.365.de" on [::]:443, ignored
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# configuration file /etc/nginx/nginx.conf:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

worker_rlimit_nofile 10000;

events {
        worker_connections 4000;
        # multi_accept on;
}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Gzip Settings
        ##

        gzip on;

        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}


#mail {
#       # See sample authentication script at:
#       # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
# 
#       # auth_http localhost/auth.php;
#       # pop3_capabilities "TOP" "USER";
#       # imap_capabilities "IMAP4rev1" "UIDPLUS";
# 
#       server {
#               listen     localhost:110;
#               protocol   pop3;
#               proxy      on;
#       }
# 
#       server {
#               listen     localhost:143;
#               protocol   imap;
#               proxy      on;
#       }
#}

# configuration file /etc/nginx/modules-enabled/50-mod-http-geoip.conf:
load_module modules/ngx_http_geoip_module.so;

# configuration file /etc/nginx/modules-enabled/50-mod-http-image-filter.conf:
load_module modules/ngx_http_image_filter_module.so;

# configuration file /etc/nginx/modules-enabled/50-mod-http-xslt-filter.conf:
load_module modules/ngx_http_xslt_filter_module.so;

# configuration file /etc/nginx/modules-enabled/50-mod-mail.conf:
load_module modules/ngx_mail_module.so;

# configuration file /etc/nginx/modules-enabled/50-mod-stream.conf:
load_module modules/ngx_stream_module.so;

# configuration file /etc/nginx/mime.types:

types {
    text/html                             html htm shtml;
    text/css                              css;
    text/xml                              xml;
    image/gif                             gif;
    image/jpeg                            jpeg jpg;
    application/javascript                js;
    application/atom+xml                  atom;
    application/rss+xml                   rss;

    text/mathml                           mml;
    text/plain                            txt;
    text/vnd.sun.j2me.app-descriptor      jad;
    text/vnd.wap.wml                      wml;
    text/x-component                      htc;

    image/png                             png;
    image/tiff                            tif tiff;
    image/vnd.wap.wbmp                    wbmp;
    image/x-icon                          ico;
    image/x-jng                           jng;
    image/x-ms-bmp                        bmp;
    image/svg+xml                         svg svgz;
    image/webp                            webp;

    application/font-woff                 woff;
    application/java-archive              jar war ear;
    application/json                      json;
    application/mac-binhex40              hqx;
    application/msword                    doc;
    application/pdf                       pdf;
    application/postscript                ps eps ai;
    application/rtf                       rtf;
    application/vnd.apple.mpegurl         m3u8;
    application/vnd.ms-excel              xls;
    application/vnd.ms-fontobject         eot;
    application/vnd.ms-powerpoint         ppt;
    application/vnd.wap.wmlc              wmlc;
    application/vnd.google-earth.kml+xml  kml;
    application/vnd.google-earth.kmz      kmz;
    application/x-7z-compressed           7z;
    application/x-cocoa                   cco;
    application/x-java-archive-diff       jardiff;
    application/x-java-jnlp-file          jnlp;
    application/x-makeself                run;
    application/x-perl                    pl pm;
    application/x-pilot                   prc pdb;
    application/x-rar-compressed          rar;
    application/x-redhat-package-manager  rpm;
    application/x-sea                     sea;
    application/x-shockwave-flash         swf;
    application/x-stuffit                 sit;
    application/x-tcl                     tcl tk;
    application/x-x509-ca-cert            der pem crt;
    application/x-xpinstall               xpi;
    application/xhtml+xml                 xhtml;
    application/xspf+xml                  xspf;
    application/zip                       zip;

    application/octet-stream              bin exe dll;
    application/octet-stream              deb;
    application/octet-stream              dmg;
    application/octet-stream              iso img;
    application/octet-stream              msi msp msm;

    application/vnd.openxmlformats-officedocument.wordprocessingml.document    docx;
    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet          xlsx;
    application/vnd.openxmlformats-officedocument.presentationml.presentation  pptx;

    audio/midi                            mid midi kar;
    audio/mpeg                            mp3;
    audio/ogg                             ogg;
    audio/x-m4a                           m4a;
    audio/x-realaudio                     ra;

    video/3gpp                            3gpp 3gp;
    video/mp2t                            ts;
    video/mp4                             mp4;
    video/mpeg                            mpeg mpg;
    video/quicktime                       mov;
    video/webm                            webm;
    video/x-flv                           flv;
    video/x-m4v                           m4v;
    video/x-mng                           mng;
    video/x-ms-asf                        asx asf;
    video/x-ms-wmv                        wmv;
    video/x-msvideo                       avi;
}

# configuration file /etc/nginx/conf.d/bbb-html5-loadbalancer.conf:
upstream poolhtml5servers {
  zone poolhtml5servers 32k;
  least_conn;
  server 127.0.0.1:4100 fail_timeout=5s max_fails=3;
  server 127.0.0.1:4101 fail_timeout=5s max_fails=3;
  server 127.0.0.1:4102 fail_timeout=5s max_fails=3;
  server 127.0.0.1:4103 fail_timeout=5s max_fails=3;
  server 127.0.0.1:4104 fail_timeout=5s max_fails=3;
  server 127.0.0.1:4105 fail_timeout=5s max_fails=3;
  server 127.0.0.1:4106 fail_timeout=5s max_fails=3;
  server 127.0.0.1:4107 fail_timeout=5s max_fails=3;
}


# configuration file /etc/nginx/sites-enabled/bbb.365.de:
#server_tokens off;

server {
  listen 80;
  listen [::]:80;
  server_name bbb.365.de;
  
  return 301 https://bbb.germany.com$request_uri; #redirect HTTP to HTTPS

}
server {
  listen 443 ssl;
  listen [::]:443 ssl;
  server_name bbb.365.de;

    ssl_certificate /etc/letsencrypt/live/bbb.germany.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/bbb.germany.com/privkey.pem;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_protocols TLSv1.2;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers on;
    ssl_dhparam /etc/nginx/ssl/dhp-4096.pem;

#  return 301 https://bbb.germany.com;
  # BigBlueButton landing page.
  location / {
    root   /var/www/bigbluebutton-default;
    index  index.html index.htm;
    expires 1m;
  }
    
  access_log  /var/log/nginx/bigbluebutton.access.log;
  
  location ~ /.well-known {
    allow all;
  }

  #error_page  404  /404.html;

  # Redirect server error pages to the static page /50x.html
  #
  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   /var/www/nginx-default;
  }
}

# configuration file /etc/nginx/sites-enabled/bbb.schwaben.de:
#server_tokens off;

server {
  listen 80;
  listen [::]:80;
  server_name bbb.schwaben.de;
  
  return 301 https://bbb.germany.com$request_uri; #redirect HTTP to HTTPS

}
server {
  listen 443 ssl;
  listen [::]:443 ssl;
  server_name bbb.365.de;

    ssl_certificate /etc/letsencrypt/live/bbb.germany.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/bbb.germany.com/privkey.pem;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_protocols TLSv1.2;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers on;
    ssl_dhparam /etc/nginx/ssl/dhp-4096.pem;

  return 301 https://bbb.germany.com;
    
  access_log  /var/log/nginx/bigbluebutton.access.log;
  
  location ~ /.well-known {
    allow all;
  }


  #error_page  404  /404.html;

  # Redirect server error pages to the static page /50x.html
  #
  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   /var/www/nginx-default;
  }
}

# configuration file /etc/nginx/sites-enabled/bigbluebutton:
server_tokens off;

server {
  listen 80;
  listen [::]:80;
  server_name bbb.germany.com;
  
  return 301 https://$server_name$request_uri; #redirect HTTP to HTTPS

}
server {
  listen 443 ssl;
  listen [::]:443 ssl;
  server_name bbb.germany.com;

    ssl_certificate /etc/letsencrypt/live/bbb.germany.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/bbb.germany.com/privkey.pem;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_protocols TLSv1.2;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers on;
    ssl_dhparam /etc/nginx/ssl/dhp-4096.pem;
    
    # HSTS (comment out to enable)
    #add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

  access_log  /var/log/nginx/bigbluebutton.access.log;

  # BigBlueButton landing page.
  location / {
    root   /var/www/bigbluebutton-default;
    index  index.html index.htm;
    expires 1m;
  }

  location ~ /.well-known {
    allow all;
  }

  # Include specific rules for record and playback
  include /etc/bigbluebutton/nginx/*.nginx;

  #error_page  404  /404.html;

  # Redirect server error pages to the static page /50x.html
  #
  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   /var/www/nginx-default;
  }
}

# configuration file /etc/bigbluebutton/nginx/bbb-html5.nginx:
location /html5client/locales {
  alias /usr/share/meteor/bundle/programs/web.browser/app/locales;
}

location /html5client/compatibility {
  alias /usr/share/meteor/bundle/programs/web.browser/app/compatibility;
}

location /html5client/resources {
  alias /usr/share/meteor/bundle/programs/web.browser/app/resources;
}

location /html5client/svgs {
  alias /usr/share/meteor/bundle/programs/web.browser/app/svgs;
}

location /html5client/fonts {
  alias /usr/share/meteor/bundle/programs/web.browser/app/fonts;
}

location ~ ^/html5client/ {
  # proxy_pass http://127.0.0.1:4100; # use for development
  proxy_pass http://poolhtml5servers; # use for production
  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "Upgrade";
}



# configuration file /etc/bigbluebutton/nginx/greenlight-redirect.nginx:
location = / {
  return 307 /b;
}

# configuration file /etc/bigbluebutton/nginx/greenlight.nginx:
# Routes requests to Greenlight based on the '/b' prefix.
# Use this file to route '/b' paths on your BigBlueButton server
# to the Greenlight application. If you are using a different
# subpath, you should change it here.

location /b {
  proxy_pass          http://127.0.0.1:5000;
  proxy_set_header    Host              $host;
  proxy_set_header    X-Forwarded-For   $proxy_add_x_forwarded_for;
  proxy_set_header    X-Forwarded-Proto $scheme;
  proxy_http_version  1.1;
}

location /b/cable {
  proxy_pass          http://127.0.0.1:5000;
  proxy_set_header    Host              $host;
  proxy_set_header    X-Forwarded-For   $proxy_add_x_forwarded_for;
  proxy_set_header    X-Forwarded-Proto $scheme;
  proxy_set_header    Upgrade           $http_upgrade;
  proxy_set_header    Connection        "Upgrade";
  proxy_http_version  1.1;
  proxy_read_timeout  6h;
  proxy_send_timeout  6h;
  client_body_timeout 6h;
  send_timeout        6h;
}

# Allow larger body size for uploading presentations
location ~ /preupload_presentation$ {
  client_max_body_size 30m;

  proxy_pass          http://127.0.0.1:5000;
  proxy_set_header    Host              $host;
  proxy_set_header    X-Forwarded-For   $proxy_add_x_forwarded_for;
  proxy_set_header    X-Forwarded-Proto $scheme;
  proxy_http_version  1.1;
}

# Only needed if using presentations and deployed at a relative root (ex "/b")
# If deploying at "/", delete the section below

location /rails/active_storage {
  return 301 /b$request_uri;
}

# configuration file /etc/bigbluebutton/nginx/notes.nginx:
# https://github.com/ether/etherpad-lite/wiki/How-to-put-Etherpad-Lite-behind-a-reverse-Proxy
location /pad/p/ {
    rewrite /pad/p/(.*) /p/$1 break;
    rewrite ^/pad/p$ /pad/p/ permanent;
    proxy_pass http://localhost:9001/p;
    proxy_pass_header Server;
    proxy_redirect /p /pad/p;
    proxy_set_header Host $host;
    proxy_buffering off;

    proxy_set_header X-Real-IP $remote_addr;  # http://wiki.nginx.org/HttpProxyModule
    proxy_set_header X-Forwarded-For $remote_addr; # EP logs to show the actual remote IP
    proxy_set_header X-Forwarded-Proto $scheme; # for EP to set secure cookie flag when https is used
    proxy_http_version 1.1;

    auth_request /bigbluebutton/connection/checkAuthorization;
    auth_request_set $auth_status $upstream_status;
}

location /pad {
    rewrite /pad/(.*) /$1 break;
    rewrite ^/pad$ /pad/ permanent;
    proxy_pass http://localhost:9001/;
    proxy_pass_header Server;
    proxy_redirect / /pad/;
    proxy_set_header Host $host;
    proxy_buffering off;
}

location /pad/socket.io/socket.io.js {
    rewrite /pad/socket.io/socket.io.js /socket.io/socket.io.js break;
    proxy_pass http://localhost:9001/;
    proxy_set_header Host $host;
    proxy_buffering off;
}

location /pad/socket.io {
    rewrite /pad/socket.io/(.*) /socket.io/$1 break;
    proxy_pass http://localhost:9001/;
    proxy_redirect / /pad/;
    proxy_set_header Host $host;
    proxy_buffering off;
    proxy_set_header X-Real-IP $remote_addr;  # http://wiki.nginx.org/HttpProxyModule
    proxy_set_header X-Forwarded-For $remote_addr; # EP logs to show the actual remote IP
    proxy_set_header X-Forwarded-Proto $scheme; # for EP to set secure cookie flag when https is used
    proxy_set_header Host $host;  # pass the host header
    proxy_http_version 1.1;  # recommended with keepalive connections
    # WebSocket proxying - from http://nginx.org/en/docs/http/websocket.html
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";

    auth_request /bigbluebutton/connection/checkAuthorization;
    auth_request_set $auth_status $upstream_status;
}

location /static {
    rewrite /static/(.*) /static/$1 break;
    proxy_pass http://localhost:9001/;
    proxy_set_header Host $host;
    proxy_buffering off;
}

# configuration file /etc/bigbluebutton/nginx/playback.nginx:
location /playback/presentation/2.3 {
  root /var/bigbluebutton;
  try_files $uri /playback/presentation/2.3/index.html;
}

# configuration file /etc/bigbluebutton/nginx/presentation-slides.nginx:
#
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
#
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
#
# This program is free software; you can redistribute it and/or modify it under the
# terms of the GNU Lesser General Public License as published by the Free Software
# Foundation; either version 3.0 of the License, or (at your option) any later
# version.
#
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License along
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
#

# Have nginx serve the presentation slides instead of tomcat as large files
# causes tomcat to OOM. (ralam sept 20, 2018)

        location ~^\/bigbluebutton\/presentation\/(?<meeting_id_1>[A-Za-z0-9\-]+)\/(?<meeting_id_2>[A-Za-z0-9\-]+)\/(?<pres_id>[A-Za-z0-9\-]+)\/svg\/(?<page_num>\d+)$ {
                default_type image/svg+xml;
                alias    /var/bigbluebutton/$meeting_id_2/$meeting_id_2/$pres_id/svgs/slide$page_num.svg;
        }

        location ~^\/bigbluebutton\/presentation\/(?<meeting_id_1>[A-Za-z0-9\-]+)\/(?<meeting_id_2>[A-Za-z0-9\-]+)\/(?<pres_id>[A-Za-z0-9\-]+)\/slide\/(?<page_num>\d+)$ {
                alias    /var/bigbluebutton/$meeting_id_2/$meeting_id_2/$pres_id/slide-$page_num.swf;
        }

        location ~^\/bigbluebutton\/presentation\/(?<meeting_id_1>[A-Za-z0-9\-]+)\/(?<meeting_id_2>[A-Za-z0-9\-]+)\/(?<pres_id>[A-Za-z0-9\-]+)\/thumbnail\/(?<page_num>\d+)$ {
                default_type image/png;
                alias    /var/bigbluebutton/$meeting_id_2/$meeting_id_2/$pres_id/thumbnails/thumb-$page_num.png;
        }

        location ~^\/bigbluebutton\/presentation\/(?<meeting_id_1>[A-Za-z0-9\-]+)\/(?<meeting_id_2>[A-Za-z0-9\-]+)\/(?<pres_id>[A-Za-z0-9\-]+)\/textfiles\/(?<page_num>\d+)$ {
                default_type text/plain;
                alias    /var/bigbluebutton/$meeting_id_2/$meeting_id_2/$pres_id/textfiles/slide-$page_num.txt;
        }



# configuration file /etc/bigbluebutton/nginx/presentation.nginx:
#
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
#
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
#
# This program is free software; you can redistribute it and/or modify it under the
# terms of the GNU Lesser General Public License as published by the Free Software
# Foundation; either version 3.0 of the License, or (at your option) any later
# version.
#
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License along
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
#

        location /playback/presentation/playback.html {
                return 301 /playback/presentation/0.81/playback.html?$query_string;
                # If you have recordings from 0.9.0 beta versions and are sure
                # that you will never want to play recordings made with
                # BigBlueButton 0.81, comment the line above and uncomment the
                # following line:
                #return 301 /playback/presentation/0.9.0/playback.html?$query_string;
        }

        location /playback/presentation/2.0/playback.html {
                return 301 /playback/presentation/2.3/$arg_meetingId?$query_string;
        }

        location /playback/presentation {
                root    /var/bigbluebutton;
                index  index.html index.htm;
        }

        location /presentation {
                root    /var/bigbluebutton/published;
                index  index.html index.htm;
        }

# configuration file /etc/bigbluebutton/nginx/sip.nginx:
location /ws {
        proxy_pass http://192.109.24.80:5066;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_read_timeout 6h;
        proxy_send_timeout 6h;
        client_body_timeout 6h;
        send_timeout 6h;

        auth_request /bigbluebutton/connection/checkAuthorization;
        auth_request_set $auth_status $upstream_status;
}


# configuration file /etc/bigbluebutton/nginx/web.nginx:
        # Handle request to bbb-web running within a SpringBoot Tomcat embedded servlet container.  This is for BBB-API and Presentation.
        location /bigbluebutton {
                proxy_http_version 1.1;

                location /bigbluebutton {
                        proxy_pass         http://127.0.0.1:8090;
                        proxy_redirect     default;
                        proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;

                        # Workaround IE refusal to set cookies in iframe
                        add_header P3P 'CP="No P3P policy available"';
                }


                location ~ "^\/bigbluebutton\/presentation\/(?<prestoken>[a-zA-Z0-9_-]+)/upload$" {
                        proxy_pass         http://127.0.0.1:8090;
                        proxy_redirect     default;
                        proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;

                        # Workaround IE refusal to set cookies in iframe
                        add_header P3P 'CP="No P3P policy available"';

                        # Allow 30M uploaded presentation document.
                        client_max_body_size       30m;
                        client_body_buffer_size    128k;

                        proxy_connect_timeout      90;
                        proxy_send_timeout         90;
                        proxy_read_timeout         90;

                        proxy_buffer_size          4k;
                        proxy_buffers              4 32k;
                        proxy_busy_buffers_size    64k;
                        proxy_temp_file_write_size 64k;

                        include    fastcgi_params;

                        proxy_request_buffering off;

                        # Send a sub-request to allow bbb-web to refuse before loading
                        auth_request /bigbluebutton/presentation/checkPresentation;

                }

                location /bigbluebutton/presentation/download {
                        return 404;
                }

                location ~ "^/bigbluebutton/presentation/download\/[0-9a-f]+-[0-9]+/[0-9a-f]+-[0-9]+$" {
                        if ($arg_presFilename !~ "^[0-9a-f]+-[0-9]+\.[0-9a-zA-Z]+$") {
                                return 404;
                        }
                        proxy_pass         http://127.0.0.1:8090$uri$is_args$args;
                        proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
                        # Workaround IE refusal to set cookies in iframe
                        add_header P3P 'CP="No P3P policy available"';
                }

                location = /bigbluebutton/presentation/checkPresentation {
                        proxy_pass         http://127.0.0.1:8090;
                        proxy_redirect     default;
                        proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;

                        proxy_set_header        X-Presentation-Token $prestoken;
                        proxy_set_header        X-Original-URI $request_uri;
                        proxy_set_header        Content-Length "";
                        proxy_set_header        X-Original-Content-Length $http_content_length;

                        # Allow 30M uploaded presentation document.
                        client_max_body_size       30m;
                        client_body_buffer_size    128k;

                        proxy_pass_request_body off;
                        proxy_request_buffering off;

                }

                # To check connection authentication, include:
                #   auth_request /bigbluebutton/connection/checkAuthorization;
                #   auth_request_set $auth_status $upstream_status;
                #
                # and make sure to add sessionToken param in the request URI
                location = /bigbluebutton/connection/checkAuthorization {
                        internal;
                        proxy_pass               http://127.0.0.1:8090;
                        proxy_pass_request_body  off;
                        proxy_set_header         Content-Length "";
                        proxy_set_header         X-Original-URI $request_uri;
                }

                location = /bigbluebutton/connection/validatePad {
                        internal;
                        proxy_pass               http://127.0.0.1:8090;
                        proxy_pass_request_body  off;
                        proxy_set_header         Content-Length "";
                        proxy_set_header         X-Original-URI $request_uri;
                }

        location ~ "^/bigbluebutton\/textTrack\/(?<textTrackToken>[a-zA-Z0-9]+)\/(?<recordId>[a-zA-Z0-9_-]+)\/(?<textTrack>.+)$" {
            # Workaround IE refusal to set cookies in iframe
            add_header P3P 'CP="No P3P policy available"';

            # Allow 30M uploaded presentation document.
            client_max_body_size       30m;
            client_body_buffer_size    128k;

            proxy_connect_timeout      90;
            proxy_send_timeout         90;
            proxy_read_timeout         90;

            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
            proxy_temp_file_write_size 64k;

            include    fastcgi_params;

            proxy_request_buffering off;

            # Send a sub-request to allow bbb-web to refuse before loading
            auth_request /bigbluebutton/textTrack/validateAuthToken;

            default_type text/plain;
            alias    /var/bigbluebutton/captions/$recordId/$textTrack;

        }

        location = /bigbluebutton/textTrack/validateAuthToken {
            internal;
            proxy_pass         http://127.0.0.1:8090;
            proxy_redirect     default;
            proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;

            proxy_set_header        X-textTrack-token $textTrackToken;
            proxy_set_header        X-textTrack-recordId $recordId;
            proxy_set_header        X-textTrack-track $textTrack;
            proxy_set_header        X-Original-URI $request_uri;
        }

        }

# configuration file /etc/nginx/fastcgi_params:

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

# configuration file /etc/bigbluebutton/nginx/webrtc-sfu.nginx:
location /bbb-webrtc-sfu {
    proxy_pass http://127.0.0.1:3008;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_read_timeout 6h;
    proxy_send_timeout 6h;
    client_body_timeout 6h;
    send_timeout 6h;

    auth_request /bigbluebutton/connection/checkAuthorization;
    auth_request_set $auth_status $upstream_status;
}


# configuration file /etc/nginx/sites-enabled/default:
##
# You should look at the following URL's in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
# https://www.nginx.com/resources/wiki/start/
# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
# https://wiki.debian.org/Nginx/DirectoryStructure
#
# In most cases, administrators will remove this file from sites-enabled/ and
# leave it as reference inside of sites-available where it will continue to be
# updated by the nginx packaging team.
#
# This file will automatically load configuration files provided by other
# applications, such as Drupal or Wordpress. These applications will be made
# available underneath a path with that package name, such as /drupal8.
#
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
##

# Default server configuration
#
server {
        listen 80 default_server;
        listen [::]:80 default_server;

        # SSL configuration
        #
        # listen 443 ssl default_server;
        # listen [::]:443 ssl default_server;
        #
        # Note: You should disable gzip for SSL traffic.
        # See: https://bugs.debian.org/773332
        #
        # Read up on ssl_ciphers to ensure a secure configuration.
        # See: https://bugs.debian.org/765782
        #
        # Self signed certs generated by the ssl-cert package
        # Don't use them in a production server!
        #
        # include snippets/snakeoil.conf;

        root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;

        server_name _;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }

        # pass PHP scripts to FastCGI server
        #
        #location ~ \.php$ {
        #       include snippets/fastcgi-php.conf;
        #
        #       # With php-fpm (or other unix sockets):
        #       fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        #       # With php-cgi (or other tcp sockets):
        #       fastcgi_pass 127.0.0.1:9000;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #       deny all;
        #}
}


# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
#server {
#       listen 80;
#       listen [::]:80;
#
#       server_name example.com;
#
#       root /var/www/example.com;
#       index index.html;
#
#       location / {
#               try_files $uri $uri/ =404;
#       }
#}
1 Like

Excellent. Thanks for that. :slightly_smiling_face:

There is definitely more than a little bit of confusion and redundancy in there. I have a strong feeling this is due to copy and paste. Before proceeding with any changes though, there is something that needs to be fully clarified. What, exactly, are bbb.365.de and bbb.schwaben.de supposed to be doing? It appears from the configuration that bbb.germany.com is the final goal.

Edit:
I noticed that the CNAME records for bbb.365.de and bbb.schwaben.de pointing to bbb.germany.com have been removed. Knowing the purposes for bbb.365.de and bbb.schwaben.de will help determine if those CNAME records would be useful.

Not really, it was build by that install script here:
wget -qO- https://ubuntu.bigbluebutton.org/bbb-install.sh | bash -s -- -v bionic-230-dev -s bbb.germany.com -g

bbb.365.de and bbb.schwaben.de ultimately only serve to ensure that the same BigBluebutton can be reached under 3 domains. That's why I set CNAME. I am considering, however, whether I should remove bbb.365.de and bbb.schwaben.de from the certificate, since everything points to bbb.germany.com anyway.

1 Like

There are really two scenarios here that are currently intermingled:

  1. Use the two secondary domain names as aliases or proxies for the primary domain name. Making this happen seamlessly can be a bit tricky, but is possible.
  2. Forward requests sent to the two secondary domain names to the primary domain name.

The functional difference between these two scenarios is that in the first scenario the secondary domain names respond for themselves, effectively sitting in front of the primary domain name, while in the second scenario the primary domain name responds for the secondary domain names. The second scenario is usually preferable from a search engine optimization (SEO) standpoint as it funnels all of the traffic for all three domain names to a single domain name whereas the first scenario can be seen as effectively splitting the traffic into thirds.

There are at present what appear to be incorrect directives in several of the server blocks, but the direction to take in fixing them depends upon the desired behavior.

If you were to remove the two secondary domain names from the certificate, your visitors would begin receiving security warnings because there would be no matching certificate to serve for either.

Thanks for your explanations and analysis. I have meanwhile deleted the certificate with:
certbot delete -d bbb.365.de
and the whole certificate was deleted - I have a backup about it.

But now, when I want to generate a new certificate only for bbb.germany.com it fails again with:

certbot certonly --webroot -w /var/www/bigbluebutton-default --domain bbb.germany.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for bbb.germany.com
Using the webroot path /var/www/bigbluebutton-default for all unmatched domains.
Waiting for verification...
Cleaning up challenges
Failed authorization procedure. bbb.germany.com (http-01): urn:ietf:params:acme:error:unauthorized :: The client lacks sufficient authorization :: Invalid response from https://bbb.germany.com/.well-known/acme-challenge/sZ8rA19Vi8D_6nWWgLwFbYoAwECtOVy_a57S4JGME2Q [192.109.24.80]: "<html>\r\n<head><title>404 Not Found</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>404 Not Found</h1></center>\r\n<hr><center>"

IMPORTANT NOTES:
 - The following errors were reported by the server:

   Domain: bbb.germany.com
   Type:   unauthorized
   Detail: Invalid response from
   https://bbb.germany.com/.well-known/acme-challenge/sZ8rA19Vi8D_6nWWgLwFbYoAwECtOVy_a57S4JGME2Q
   [192.109.24.80]: "<html>\r\n<head><title>404 Not
   Found</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>404
   Not Found</h1></center>\r\n<hr><center>"

   To fix these errors, please make sure that your domain name was
   entered correctly and the DNS A/AAAA record(s) for that domain
   contain(s) the right IP address.

What is there wrong?

1 Like

Let's try to make your life considerably easier. :slightly_smiling_face:

First off, taking a look at the following two configuration files, you'll notice that the port 443 server blocks in both configuration files have server_name bbb.365.de, which means there is no port 443 server block for bbb.schwaben.de. Ignore this for now though and keep reading below for a better solution.




Rather than having separate configuration files for bbb.365.de and bbb.schwaben.de, let's just make a few simple changes to the configuration file for bbb.germany.com, which is listed below and truncated for clarity.



First, change server_name bbb.germany.com; to server_name bbb.germany.com bbb.365.de bbb.schwaben.de; in both the port 80 and port 443 server blocks in the configuration file for bbb.germany.com (/etc/nginx/sites-enabled/bigbluebutton).

Second, remove bbb.365.de and bbb.schwaben.de from the /etc/nginx/sites-enabled/ directory.

Third, reload nginx with sudo nginx -s reload to get things running.

With those done, try issuing the correct certificate covering all three domain names:

sudo certbot certonly --cert-name bbb.germany.com --nginx -d "bbb.germany.com,bbb.365.de,bbb.schwaben.de" --deploy-hook "nginx -s reload"

1 Like

Hello Griffin,
thanks very much for your time and support. It was helpful and I have more learned about Nginx, it is new for me, because normally I use Apache.

Greetings
Kaheto

3 Likes

You are quite welcome! :slightly_smiling_face:

1 Like

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.