Ssl

伺服器應支持 SSL,但未配置證書

  • June 25, 2017

我正在嘗試在我的 ubuntu 14.04 伺服器中設置 SSL。在生成我的自簽名 RSA 證書並設置所有必要的配置後,我的伺服器無法啟動。我收到此錯誤消息到我的/var/log/apache2/error.log

$cat /var/log/apache2/error.log
Server should be SSL-aware but has no certificate configured [Hint: SSLCertificateFile] (/etc/apache2/sites-enabled/default-ssl.conf:2)

我的/etc/apache2目錄樹:

/etc/apache2
|---> ... other files
|---> server.key
|---> server.crt
|---> ports.conf
|---> sites-available
       |
       |---> default-ssl.conf
|---> sites-enabled
       |
       |---> default-ssl.conf

檢查是否啟用了預設配置:

$sudo a2ensite default-ssl.conf
Site default-ssl already enabled

的內容default-ssl.conf

$cat default-ssl.conf
<IfModule mod_ssl.c>
   <VirtualHost _default_:443>
           ServerAdmin webmaster@localhost

           DocumentRoot /var/www/html

           # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
           # error, crit, alert, emerg.
           # It is also possible to configure the loglevel for particular
           # modules, e.g.
           #LogLevel info ssl:warn

           ErrorLog ${APACHE_LOG_DIR}/error.log
           CustomLog ${APACHE_LOG_DIR}/access.log combined

           # For most configuration files from conf-available/, which are
           # enabled or disabled at a global level, it is possible to
           # include a line for only one particular virtual host. For example the
           # following line enables the CGI configuration for this host only
           # after it has been globally disabled with "a2disconf".
           #Include conf-available/serve-cgi-bin.conf

           #   SSL Engine Switch:
           #   Enable/Disable SSL for this virtual host.
           SSLEngine on

           #   A self-signed (snakeoil) certificate can be created by installing
           #   the ssl-cert package. See
           #   /usr/share/doc/apache2/README.Debian.gz for more info.
           #   If both key and certificate are stored in the same file, only the
           #   SSLCertificateFile directive is needed.
           #SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
           SSLCertificateKeyFile /etc/apache2/server.key

           #   Server Certificate Chain:
           #   Point SSLCertificateChainFile at a file containing the
           #   concatenation of PEM encoded CA certificates which form the
           #   certificate chain for the server certificate. Alternatively
           #   the referenced file can be the same as SSLCertificateFile
           #   when the CA certificates are directly appended to the server
           #   certificate for convinience.
           SSLCertificateChainFile /etc/apache2/server.crt

           #   Certificate Authority (CA):
           #   Set the CA certificate verification path where to find CA
           #   certificates for client authentication or alternatively one
           #   huge file containing all of them (file must be PEM encoded)
           #   Note: Inside SSLCACertificatePath you need hash symlinks
           #                to point to the certificate files. Use the provided
           #                Makefile to update the hash symlinks after changes.
           #SSLCACertificatePath /etc/ssl/certs/
           #SSLCACertificateFile /etc/apache2/ssl.crt/ca-bundle.crt

           #   Certificate Revocation Lists (CRL):
           #   Set the CA revocation path where to find CA CRLs for client
           #   authentication or alternatively one huge file containing all
           #   of them (file must be PEM encoded)
           #   Note: Inside SSLCARevocationPath you need hash symlinks
           #                to point to the certificate files. Use the provided
           #                Makefile to update the hash symlinks after changes.
           #SSLCARevocationPath /etc/apache2/ssl.crl/
           #SSLCARevocationFile /etc/apache2/ssl.crl/ca-bundle.crl

           #   Client Authentication (Type):
           #   Client certificate verification type and depth.  Types are
           #   none, optional, require and optional_no_ca.  Depth is a
           #   number which specifies how deeply to verify the certificate
           #   issuer chain before deciding the certificate is not valid.
           #SSLVerifyClient require
           #SSLVerifyDepth  10

           #   SSL Engine Options:
           #   Set various options for the SSL engine.
           #   o FakeBasicAuth:
           #        Translate the client X.509 into a Basic Authorisation.  This means that
           #        the standard Auth/DBMAuth methods can be used for access control.  The
           #        user name is the `one line' version of the client's X.509 certificate.
           #        Note that no password is obtained from the user. Every entry in the user
           #        file needs this password: `xxj31ZMTZzkVA'.
           #   o ExportCertData:
           #        This exports two additional environment variables: SSL_CLIENT_CERT and
           #        SSL_SERVER_CERT. These contain the PEM-encoded certificates of the
           #        server (always existing) and the client (only existing when client
           #        authentication is used). This can be used to import the certificates
           #        into CGI scripts.
           #   o StdEnvVars:
           #        This exports the standard SSL/TLS related `SSL_*' environment variables.
           #        Per default this exportation is switched off for performance reasons,
           #        because the extraction step is an expensive operation and is usually
           #        useless for serving static content. So one usually enables the
           #        exportation for CGI and SSI requests only.
           #   o OptRenegotiate:
           #        This enables optimized SSL connection renegotiation handling when SSL
           #        directives are used in per-directory context.
           #SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
           <FilesMatch "\.(cgi|shtml|phtml|php)$">
                           SSLOptions +StdEnvVars
           </FilesMatch>
           <Directory /usr/lib/cgi-bin>
                           SSLOptions +StdEnvVars
           </Directory>

           #   SSL Protocol Adjustments:
           #   The safe and default but still SSL/TLS standard compliant shutdown
           #   approach is that mod_ssl sends the close notify alert but doesn't wait for
           #   the close notify alert from client. When you need a different shutdown
           #   approach you can use one of the following variables:
           #   o ssl-unclean-shutdown:
           #        This forces an unclean shutdown when the connection is closed, i.e. no
           #        SSL close notify alert is send or allowed to received.  This violates
           #        the SSL/TLS standard but is needed for some brain-dead browsers. Use
           #        this when you receive I/O errors because of the standard approach where
           #        mod_ssl sends the close notify alert.
           #   o ssl-accurate-shutdown:
           #        This forces an accurate shutdown when the connection is closed, i.e. a
           #        SSL close notify alert is send and mod_ssl waits for the close notify
           #        alert of the client. This is 100% SSL/TLS standard compliant, but in
           #        practice often causes hanging connections with brain-dead browsers. Use
           #        this only for browsers where you know that their SSL implementation
           #        works correctly.
           #   Notice: Most problems of broken clients are also related to the HTTP
           #   keep-alive facility, so you usually additionally want to disable
           #   keep-alive for those clients, too. Use variable "nokeepalive" for this.
           #   Similarly, one has to force some clients to use HTTP/1.0 to workaround
           #   their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and
           #   "force-response-1.0" for this.
           BrowserMatch "MSIE [2-6]" \
                           nokeepalive ssl-unclean-shutdown \
                           downgrade-1.0 force-response-1.0
           # MSIE 7 and newer should be able to use keepalive
           BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

   </VirtualHost>  
</IfModule>

文件內容ports.conf

$cat /etc/apache2/ports.conf

Listen 80
Listen 443

<ifModule ssl_module>
   Listen 443
</ifModule>

<ifModule mod_gnutls.c>
   Listen 443
<ifModule>

指向的符號連結default-ssl.conf已經建立:

$ls -l /etc/apache2/sites-enabled/default-ssl.conf
lrwxrwxrwx 1 root root 35 Jun 25 15:42 default-ssl.conf -> ../sites-available/default-ssl.conf

最後,我想強調一下,我已經檢查了我的私鑰/證書的完整性,並且檢查確實成立。

任何幫助將不勝感激。謝謝你。

錯誤消息有一個非常好的提示:

Server should be SSL-aware but has no certificate configured [Hint: SSLCertificateFile]

那麼,你的里面有什麼SSLCertificateFile

  SSLEngine on
  #SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
  SSLCertificateKeyFile /etc/apache2/server.key
  SSLCertificateChainFile /etc/apache2/server.crt

是的,因為它被註釋掉了,所以什麼都沒有,即使沒有,它似乎也只是snakeoil.

此外, 與SSLCertificateChainFile不一樣SSLCertificateFile。事實上…

SSLCertificateChainFile在 2.4.8 版中已過時,當時 SSLCertificateFile已擴展為還從伺服器證書文件載入中間 CA 證書。

我相信你/etc/apache2/server.crt有證書加鏈。簡單地刪除Chain,即

  SSLCertificateFile /etc/apache2/server.crt

引用自:https://serverfault.com/questions/857781