Certbot: Kesalahan: opsi mendengarkan duplikat untuk [::]: 443

Dibuat pada 7 Feb 2018  ·  30Komentar  ·  Sumber: certbot/certbot

Sistem operasi saya adalah (termasuk versi):

Ubuntu 16.04

Saya menginstal Certbot dengan (certbot-auto, manajer paket OS, pip, dll):

sudo apt-get install python-certbot-nginx

Saya menjalankan perintah ini dan menghasilkan keluaran ini:

nginx: [emerg] duplicate listen options for [::]:443 in /etc/nginx/sites-enabled/example.online:29

Perilaku Certbot berbeda dari yang saya harapkan karena:

Seharusnya tidak ada kesalahan

Berikut adalah blok server nginx atau Apache virtualhost yang relevan untuk domain yang saya konfigurasi:

server {
  listen 80;
  listen [::]:80;

  server_name example.online;

  root /home/example/deploy;
  index index.html;

  location / {
    try_files $uri $uri/ =404;
  }
}

server {
  listen 80;
  listen [::]:80;
  server_name www.example.online;
  return 301 $scheme://example.online$request_uri;
}

nginx bug

Komentar yang paling membantu

Permasalahan yang sama.

Saya menjalankan perintah: certbot --redirect --nginx -d readacted.com -d www.redacted.com

file conf asli saya terlihat seperti:

    server {
        server_name redacted.com;
        location / {
        root   /home/redacted/www;
        index  index.html;
      }
    }

    server {
        listen 80;
        listen [::]:80;
        server_name www.redacted.com;
        return 301 $scheme://redacted.com$request_uri;
    }

menurut /var/log/letsencrypt/letsencrypt.log saya melihat certbot mencoba melakukan ini:

    server {
        server_name redacted.com;
        location / {
        root   /home/redacted/www;
        index  index.html;
      }

        listen [::]:443 ssl ipv6only=on; # managed by Certbot
        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/redacted.com-0001/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/redacted.com-0001/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    }

    server {
        listen 80;
        listen [::]:80;
        server_name www.redacted.com;
        return 301 $scheme://redacted.com$request_uri;

        listen [::]:443 ssl ipv6only=on; # managed by Certbot
        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/www.redacted.com/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/www.redacted.com/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    }

nginx mengeluh bahwa pada baris listen [::]:443 ssl ipv6only=on; # managed by Certbot

pesan kesalahan sebenarnya:

nginx: [emerg] duplicate listen options for [::]:443 in /etc/nginx/sites-enabled/redacted.com:23

Google cepat memunculkan halaman ini dari tahun 2010:

http://www.serverphorums.com/read.php?5 , 203912

yang menunjukkan bahwa nginx menjadi bingung karena beberapa detail implementasi internal.

Saya bukan ahli nginx, tetapi saya telah menguji bahwa yang berikut tampaknya berfungsi:

    server {
        server_name redacted.com;
        location / {
        root   /home/redacted/www;
        index  index.html;
      }

        listen [::]:443 ssl ipv6only=on; # managed by Certbot
        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/redacted.com-0001/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/redacted.com-0001/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    }

    server {
        listen 80;
        listen [::]:80;
        server_name www.redacted.com;
        return 301 http://redacted.com$request_uri;

        listen [::]:443; # manually changed
        ssl on;  #manually changed
        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/www.redacted.com/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/www.redacted.com/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    }

Saya ingin solusi yang lebih baik bahwa solusi ini idealnya ...

Semua 30 komentar

@iamdubx apakah Anda mengetahui hal ini? Saya mengalami masalah yang sama.

Masalah yang sama ... Ini berfungsi untuk situs default saya, tetapi tidak untuk sub domain kustom

Saya mengalami masalah yang sama.

Saya memang memiliki konfigurasi untuk menangkap beberapa domain.

server {
  listen 80;
  listen [::]:80;

  root /home/primarydomain/public;
  index index.html index.htm;

  server_name domain1.com *.domain1.com domain2.com *.domain2.com domain3.com *.domain3.com domain4.com *.domain4.com;

  return 302 $scheme://primarydomain.com$request_uri;

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

  location / {
    try_files $uri $uri/ /index.html =404;
  }
}

Saya mendapatkan nginx: [emerg] duplicate listen options for [::]:443 in /etc/nginx/sites-enabled/others:19 untuk konfigurasi ini.

OS: Ubuntu 16.04. Ada bantuan?

Permasalahan yang sama.

Saya menjalankan perintah: certbot --redirect --nginx -d readacted.com -d www.redacted.com

file conf asli saya terlihat seperti:

    server {
        server_name redacted.com;
        location / {
        root   /home/redacted/www;
        index  index.html;
      }
    }

    server {
        listen 80;
        listen [::]:80;
        server_name www.redacted.com;
        return 301 $scheme://redacted.com$request_uri;
    }

menurut /var/log/letsencrypt/letsencrypt.log saya melihat certbot mencoba melakukan ini:

    server {
        server_name redacted.com;
        location / {
        root   /home/redacted/www;
        index  index.html;
      }

        listen [::]:443 ssl ipv6only=on; # managed by Certbot
        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/redacted.com-0001/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/redacted.com-0001/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    }

    server {
        listen 80;
        listen [::]:80;
        server_name www.redacted.com;
        return 301 $scheme://redacted.com$request_uri;

        listen [::]:443 ssl ipv6only=on; # managed by Certbot
        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/www.redacted.com/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/www.redacted.com/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    }

nginx mengeluh bahwa pada baris listen [::]:443 ssl ipv6only=on; # managed by Certbot

pesan kesalahan sebenarnya:

nginx: [emerg] duplicate listen options for [::]:443 in /etc/nginx/sites-enabled/redacted.com:23

Google cepat memunculkan halaman ini dari tahun 2010:

http://www.serverphorums.com/read.php?5 , 203912

yang menunjukkan bahwa nginx menjadi bingung karena beberapa detail implementasi internal.

Saya bukan ahli nginx, tetapi saya telah menguji bahwa yang berikut tampaknya berfungsi:

    server {
        server_name redacted.com;
        location / {
        root   /home/redacted/www;
        index  index.html;
      }

        listen [::]:443 ssl ipv6only=on; # managed by Certbot
        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/redacted.com-0001/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/redacted.com-0001/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    }

    server {
        listen 80;
        listen [::]:80;
        server_name www.redacted.com;
        return 301 http://redacted.com$request_uri;

        listen [::]:443; # manually changed
        ssl on;  #manually changed
        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/www.redacted.com/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/www.redacted.com/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    }

Saya ingin solusi yang lebih baik bahwa solusi ini idealnya ...

@ohemorange , apakah Anda tahu jika kami memiliki masalah pelacakan ini? Rasanya tidak asing bagi saya, tetapi saya tidak ingat apakah itu sesuatu yang telah kita lihat sebelumnya atau tidak.

Saya belum pernah melihat ini sebelumnya. Sepertinya mereka memperbaiki bug asli, kecuali jika Anda menggunakan IPv6. Dan karena kami baru saja meluncurkan dukungan IPv6, itulah mengapa orang melakukan ini. Solusi di atas akan berhasil; Saya akan melihat apakah ada alasan mengapa ini belum diperbaiki di Nginx untuk IPv6.

Sebenarnya, Anda bahkan tidak perlu melakukan perubahan ssl on - menghapus ipv6only=on dari salah satu atau keduanya akan memperbaiki masalah.

@joohoi , kami mungkin ingin memperbaikinya dengan menghapus ipv6only=on seluruhnya atau hanya memasukkannya sekali per baris alamat unik yang kami tambahkan. Apakah Anda tahu apa yang terbaik di sini?

Mengalami masalah yang sama di sini. Semuanya baik-baik saja untuk domain pertama saya. Domain kedua mulai mengalami masalah ini.

Sepertinya Certbot tidak dapat mendeteksi perintah ipv6only sepenuhnya karena alasan tertentu. Menghapus itu akan memperbaiki masalah bagi sebagian besar pengguna. Hal ini dapat menyebabkan beberapa masalah dengan versi Nginx yang sangat lama, karena perilaku ipv6only dan defaultnya telah berubah seiring waktu.

Maaf atas tambalan yang buruk, tetapi ini memperbaikinya untuk saya, semoga akan ada perbaikan yang tepat segera!

--- /usr/lib/python3/dist-packages/certbot_nginx/configurator.py.orig   2018-02-14 18:38:30.380863045 +0000
+++ /usr/lib/python3/dist-packages/certbot_nginx/configurator.py    2018-02-14 18:38:01.501018553 +0000
@@ -507,10 +507,10 @@ class NginxConfigurator(common.Installer
                           '[::]:{0}'.format(self.config.tls_sni_01_port),
                           ' ',
                           'ssl']
-            if not ipv6info[1]:
-                # ipv6only=on is absent in global config
-                ipv6_block.append(' ')
-                ipv6_block.append('ipv6only=on')
+            #if not ipv6info[1]:
+            #    # ipv6only=on is absent in global config
+            #    ipv6_block.append(' ')
+            #    ipv6_block.append('ipv6only=on')

         if vhost.ipv4_enabled():
             ipv4_block = ['\n    ',
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.3 LTS
Release:        16.04
Codename:       xenial
$ nginx -V
nginx version: nginx/1.10.3 (Ubuntu)
built with OpenSSL 1.0.2g  1 Mar 2016
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_v2_module --with-http_sub_module --with-http_xslt_module --with-stream --with-stream_ssl_module --with-mail --with-mail_ssl_module --with-threads
$ apt show python-certbot-nginx
Package: python-certbot-nginx
Version: 0.21.1-1+ubuntu16.04.1+certbot+1
Priority: optional
Section: oldlibs
Maintainer: Debian Let's Encrypt <[email protected]>
Installed-Size: 9,216 B
Depends: python3-certbot-nginx
Download-Size: 2,470 B
APT-Manual-Installed: yes
APT-Sources: http://ppa.launchpad.net/certbot/certbot/ubuntu xenial/main amd64 Packages
Description: transitional dummy package
 This is a transitional dummy package for the migration of certbot
 from python2 to python3.  It can be safely removed.

Masalah yang sama. Apakah ini akan diatasi?

Maaf untuk dinding teks, tapi ini dia.

Untuk menjelaskan masalah ini:
opsi ipv6only digunakan untuk dapat menangani beberapa pernyataan mendengarkan per soket. Sayangnya itu hanya dapat digunakan sekali dalam konfigurasi server untuk soket. Jadi Nginx akan gagal untuk memulai jika:

server {
    ...
    server_name first.example.org;
    listen [::]:80 ipv6only=on;
    listen 80;
} 
server {
    ...
    server_name second.example.org;
    listen [::]:80 ipv6only=on;
    listen 80;
}

Dengan versi Nginx terbaru, masalah ini tidak akan muncul jika pengaturan ipv6only dihilangkan sepenuhnya, karena nilai default variabel adalah ipv6only=on . Jadi berikut ini adalah konfigurasi yang valid dan berfungsi di versi Nginx> = 1.3.4:

server {
    ...
    server_name first.example.org;
    listen [::]:80;
    listen 80;
} 
server {
    ...
    server_name second.example.org;
    listen [::]:80;
    listen 80;
}

Namun nilai default variabel ipv6only di versi Nginx sebelum 1.3.4 adalah ipv6only=off , jadi versi yang lebih lama akan gagal dengan konfigurasi berikut:

server {
    ...
    server_name first.example.org;
    listen [::]:80;
    listen 80;
} 

Saat ini situasi dengan paket distribusi adalah bahwa satu-satunya distribusi yang dikirimkan dengan versi lama Nginx adalah Debian Wheezy (Debian 7), yang mengirimkan Nginx versi 1.2.1 dari repositori default.

Jika kami akan menghapus deteksi dan pengaturan ipv6only sepenuhnya dari Certbot, ini akan merusak semua pengguna di Debian Wheezy. Untungnya tanggal EOL untuk Wheezy ditetapkan pada Mei 2018 , jadi kami hampir dapat menghapus kompleksitas tambahan ini dari kode Certbot sama sekali.

Fungsionalitas Certbot saat ini mengurai konfigurasi Nginx lengkap, mendeteksi pengaturan ipv6only=on sudah ada di salah satu blok server{} dan menghilangkan penambahannya jika demikian. Namun, jika nilainya tidak ditemukan, Certbot akan menambahkannya. Masalah ini bermuara pada Certbot yang tidak dapat mendeteksi variabel yang sudah ada ini dari beberapa blok konfigurasi pengguna saat ini, dan karenanya mencoba menambahkannya ke blok server{} yang sedang dikonfigurasi.

Untuk membuat keputusan tentang rute untuk memperbaiki masalah ini, kami memerlukan contoh konfigurasi lengkap di mana Certbot gagal dengan cara yang dijelaskan di atas untuk dapat meningkatkan deteksi variabel ipv6only=on sudah ada jika kami memutuskan untuk memperbaikinya menggunakan cara itu alih-alih menghapus fungsi ini sama sekali.

Terima kasih atas tambalannya; yang berhasil untuk saya. FWIW, saya menggunakan Ubuntu 17.

Saya harus menghapus semua file

listen [::]:80;
listen 80;

Untuk membuatnya berhasil

https://github.com/chilion - terima kasih! menghapus:

listen [::]:80;
listen 80;

bekerja untuk saya juga.

Saya memiliki dua domain di satu server Ubuntu. Yang pertama berhasil tidak ada masalah. Kemudian saya mendapatkan error seperti di atas. Solusi Anda berhasil untuk saya. Saya baru saja menginstal nginx di server baru dengan segalanya segar.

Terima kasih.

menghapus listen [::]:80 tetapi menyisakan listen 80; bekerja untuk saya untuk penginstalan di domain non-default

Saya berkomentar mendengarkan [::]: 443 dalam pengaturan subdomain, kemudian berhasil. Apakah ini oke

Saya baru saja mengalami masalah ini. Setiap badan yang mencoba memahami berbagai perintah listen dan ipv6only .

Saya sangat merekomendasikan posting blog ini, sampai saya menemukan artikel ini saya tidak yakin apa hubungannya dengan semua saran berbeda yang saya temukan di web.

https://stefanchrist.eu/blog/2015_01_21/Using%20ipv6only%20in%20Nginx.xhtml

Kutipan dari posting blog ini adalah momen bola lampu bagi saya.

Parameternya berbeda dari mis. Flag ssl. Bendera ssl dapat digunakan dalam berbagai konteks server dan dinyalakan dan dimatikan sesuai keinginan. Bendera ipv6only hanya dapat disetel sekali per port (dan alamat). Hanya satu arahan mendengarkan my yang berisi parameter dan itu akan berlaku untuk semua konteks server menggunakan port ini. Jika Anda menggunakannya dua kali, daemon nginx tidak akan mulai dan akan menulis pesan kesalahan berikut ke log kesalahannya

Masih ada, setelah purge python, instal ulang kesalahan ini dilemparkan. Kesalahan di suatu tempat di certbot

Mengomentari baris ini menyelesaikan kesalahan, tetapi menimbulkan masalah lain

server {
        listen  443 ssl http2;
#        listen [::]:443 ssl http2 ipv6only=on;


Dalam kasus beberapa domain

Dari pada
dengarkan [::]: 443 ssl http2 ipv6only = on;

Menggunakan
dengarkan contoh. com: 443 ssl http2 ipv6only = on;

Hilangkan perintah listen di semua blok server Anda.

Kesalahan ini muncul ketika ada dua blok server yang mendengarkan di domain yang sama dengan port yang sama.
Periksa semua file konfigurasi Anda di folder yang tersedia situs untuk pendengar duplikat. Dalam kasus saya, certbot membuat duplikat pendengar untuk 443 di file default.

Jika Anda dapat memberikan file konfigurasi untuk mereproduksi ini dengan versi Certbot terbaru, saya akan tertarik untuk melihatnya.

Untuk para petualang yang mungkin mendapatkan tiket ini di masa depan melalui pencarian yang sepi, dan mereka tidak tahu mengapa ini terjadi ketika mereka tidak memiliki ipv6only=on tempat lain.

Anda akan mendapatkan kesalahan / masalah yang sama jika Anda memiliki reuseport dalam konfigurasi Anda.

Saya akui, saya bingung. Menurut dokumentasi nginx , ada sejumlah parameter untuk listen , tetapi hanya ipv6only menentukan "Ini hanya dapat disetel sekali saat mulai." Apakah baris ini hilang dari parameter yang tersisa? Apakah itu bergantung pada sistem? Saya mulai berpikir bahwa memperbaiki perilaku ini di hulu mungkin merupakan tindakan terbaik; Tampaknya konyol untuk hanya mengizinkan opsi ini disetel sekali.

Sayangnya saya bukan ahli dalam soket linux, jadi saya tidak dapat membuat opini yang tepat mengapa opsi tersebut hanya dapat disetel sekali, tetapi saya yakin ada alasannya.

Mungkin posting ini membantu: https://www.nginx.com/blog/socket-sharding-nginx-release-1-9-1/

Yang saya tahu adalah, seperti ipv6only , reuseport juga hanya dapat disetel sekali untuk setiap port tertentu (jadi hanya satu pendengar yang dapat memilikinya). Mengapa ini kebetulan bertentangan (karena kurangnya kata yang lebih baik) dengan ipv6only , saya tidak tahu.

Namun, saya merasa menambahkan ipv6only=on saat menjalankan certbot agak sia-sia.

Ini tidak lagi diperlukan sejak nginx 1.3.4, yang telah dirilis pada tahun 2012 , dan secara teknis EOL.

Setidaknya, mungkin harus ada pemeriksaan versi dan hanya tambahkan jika nginx < 1.3.4 sebelum menambahkannya.

Kami tidak mengaturnya di Certbot. Saat kami membuat blok server, kami menyalin beberapa arahan dari blok server default yang ada, atau blok server template lainnya, termasuk arahan mendengarkan bersama dengan opsinya. Ini memungkinkan Certbot bekerja meskipun Nginx berada di belakang proxy atau jenis penerusan port lainnya. Kami secara eksplisit menghapus ipv6only=on dari blok server yang digandakan karena dokumentasi menunjukkan itu hanya dapat digunakan sekali.

Idealnya, kami akan melakukan hal yang sama untuk semua opsi yang kami tahu tidak dapat diduplikasi dengan cara ini, tetapi biarkan opsi lain yang mungkin secara khusus diinginkan pengguna untuk dimiliki oleh semua blok server mereka. Untuk melakukan itu, kita harus mengetahui opsi mana yang dapat diulang, yang tampaknya tidak ditunjukkan oleh dokumentasi, dan yang tampaknya hanya kita temukan melalui orang-orang yang datang kepada kita tentang masalah seperti ini.

Terima kasih @joohoi
Penjelasan & solusi Anda berfungsi untuk saya di Ubuntu 20 dengan versi nginx: 1.18.0

Saya memiliki 2 VPS: 1 adalah Ubuntu menjalankan Nginx 1.10 berfungsi dengan baik, yang lainnya adalah Centos menjalankan Nginx 1.16 dan memiliki kesalahan ini. Aneh

Apakah halaman ini membantu?
0 / 5 - 0 peringkat