如何允许本地主机上的Apache使用HTTPS ?

我被要求在Apache上的localhost上使用自签名证书设置HTTPS,但我实际上如何做到这一点?我完全不知道。

297921 次浏览

这实际上很简单,假设您手边有一个openssl安装。(您在哪个站台?)

假设你在linux/solaris/mac os/x上,Van's Apache SSL/TLS mini-HOWTO有一个很好的演练,我不会在这里复制。

但是,执行摘要是您必须创建一个自签名证书。由于您运行apache for localhost大概是为了开发(即不是公共web服务器),您将知道您可以信任自签名证书,并且可以忽略浏览器抛出的警告。

我刚刚尝试了这一点-我需要在我的Windows上的localhost Apache上测试一些开发代码。这比想象中要困难得多。但下面这些步骤在经历了多次拉扯之后还是有效的……

我发现我的Apache安装自带openssl.exe,这很有帮助。如果你没有副本,你需要下载。我的副本在Apache2\bin文件夹中,这就是我在下面引用它的方式。

步骤:

  1. 确保你对Apache conf文件夹有写权限
  2. 打开Apache2\conf文件夹中的命令提示符
  3. <李> < br >类型 李..\bin\openssl req -config openssl.cnf -new -out blarg.csr -keyout blarg.pem < / >
  4. 除以下问题外,其他问题均可留空:

    • PEM密码:临时密码,如“password”
    • Common Name:服务器的主机名

    < img src = " https://i.stack.imgur.com/FrCvj.png " alt = " " > < / p >

  5. 当完成时,输入
    ..\bin\openssl rsa -in blarg.pem -out blarg.key < / p > < / >

  6. 通过输入
    生成自签名证书 ..\bin\openssl x509 -in blarg.csr -out blarg.cert -req -signkey blarg.key -days 365 < / p >

    < img src = " https://i.stack.imgur.com/QT55D.png " alt = " " > < / p >

  7. 打开Apache的conf\httpd.conf文件,并确保SSL模块已启用-在这一行的开头不应该有哈希:
    LoadModule ssl_module modules/mod_ssl.so < / p >

    < img src = " https://i.stack.imgur.com/z4ScH.png " alt = " " > < / p >

  8. 一些Apache安装将SSL配置放在一个单独的文件中。如果是,请确保包含SSL conf文件。在我的情况下,我必须取消注释这一行:
    Include conf/extra/httpd-ssl.conf < / p > < / >
  9. 在SSL配置httpd-ssl.conf中,我必须更新以下行:

    • 更新
      SSLSessionCache "shmcb:C:\Program Files (x86)\Zend\Apache2/logs/ssl_scache(512000)"

      SSLSessionCache "shmcb:C:/Progra\~2/Zend/Apache2/logs/ssl_scache(512000)"
      (路径中的括号会混淆模块,所以我们需要转义它们)
    • DocumentRoot -设置为您的web文件的文件夹
    • ServerName -服务器的主机名
    • SSLCertificateFile "conf/blarg.cert"
    • SSLCertificateKeyFile "conf/blarg.key"
    < p > < img src = " https://i.stack.imgur.com/mlESG.png " alt = " " > < img src = " https://i.stack.imgur.com/M0nRJ.png " alt = " " > < / p > < /李>
  10. 重新启动Apache。

  11. 尝试在浏览器中加载https://localhost/

希望你能做到这一步。请随时更新这篇文章与任何其他有用的信息。

(截图由Neil Obremski提供,他的文章 -尽管现在已经过时了。)

我使用ngrok (https://ngrok.com/)来实现这一点。 Ngrok是一个命令行工具,用于为本地主机创建隧道。它同时创建http和https连接。 下载完成后,需要执行以下命令:

ngrok http 80

(在版本2中,语法是:ngrok http 80。在版本2中,任何端口都可以通过隧道。)

几秒钟后,它会给出两个url:

http://a_hexadecimal_number.ngrok.com
https://a_hexadecimal_number.ngrok.com

现在,两个url都指向localhost。

这是最简单的方法

首先复制这些server.crt &server.key文件(见附件)到你的apache/conf/ssl目录

打开httpd.conf文件&添加以下行

Listen 80
Listen 443


NameVirtualHost *:80
NameVirtualHost *:443


<VirtualHost *:443>
DocumentRoot "d:/wamp/www"  #your wamp www root dir
ServerName localhost
SSLEngine on
SSLCertificateFile "d:/wamp/bin/apache/Apache2.4.4/conf/ssl/server.crt"
SSLCertificateKeyFile "d:/wamp/bin/apache/Apache2.4.4/conf/ssl/server.key"
</VirtualHost>

这应该是工作Ubuntu,薄荷类似于Apache2

这是一个很好的指南,所以遵循这个

https://www.digitalocean.com/community/tutorials/how-to-create-a-ssl-certificate-on-apache-for-ubuntu-14-04

然后像这样留下ssl。conf

<VirtualHost _default_:443>
ServerAdmin your@email.com
ServerName localhost
ServerAlias www.localhost.com


DocumentRoot /var/www




SSLEngine on
SSLCertificateFile /etc/apache2/ssl/apache.crt
SSLCertificateKeyFile /etc/apache2/ssl/apache.key

你可以得到它。

希望这对linuxer有帮助

Windows + Apache 2.4,例如:

  1. 撤销你的httpd.conf文件中的ssl_module。

    LoadModule ssl_module modules/mod_ssl.so
    
  2. listen 443 port just like 80 port in your httpd.conf file.

    Listen 80
    Listen 443
    
  3. uncomment Include Virtual hosts in your httpd.conf file.

    # Virtual hosts
    Include conf/extra/httpd-vhosts.conf
    
  4. add VirtualHost in your conf/extra/httpd-vhosts.conf

    <VirtualHost _default_:443>
    DocumentRoot "D:/www"  #your site directory path
    ServerName localhost
    #ServerAlias localhost.com localhost2.com
    SSLEngine on
    SSLCertificateFile "${SRVROOT}/conf/ssl/server.crt"
    SSLCertificateKeyFile "${SRVROOT}/conf/ssl/server.key"
    <Directory "D:/www">
    Options -Indexes +FollowSymLinks +ExecCGI
    AllowOverride All
    Require all granted
    </Directory>
    </VirtualHost>
    

only the port number 443 and SSL...... lines are different from normal http config.

save you config file and restart apache service. then you can visit https://localhost/

The web browser will warn you that it's unsafe at the first time, just choose go on.

另一个简单的方法是在Ubuntu中使用Python Server。

  1. 在终端中使用以下命令生成server.xml:

    openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes

    注意:假设你已经安装了openssl

  2. 将下面的代码保存在任何目录下名为simple-https-server.py的文件中,你想要运行服务器。

    import BaseHTTPServer, SimpleHTTPServer
    import ssl
    
    
    httpd = BaseHTTPServer.HTTPServer(('localhost', 4443), SimpleHTTPServer.SimpleHTTPRequestHandler)
    httpd.socket = ssl.wrap_socket (httpd.socket, certfile='./server.pem', server_side=True)
    httpd.serve_forever()
    
  3. Run the server from terminal:

    python simple-https-server.py

  4. Visit the page at:

    https://localhost:4443

Extra notes::

  1. You can change the port in simple-https-server.py file in line

    httpd = BaseHTTPServer.HTTPServer(('localhost', 4443), SimpleHTTPServer.SimpleHTTPRequestHandler)

  2. You can change localhost to your IP in the same line above:

    httpd = BaseHTTPServer.HTTPServer(('10.7.1.3', 4443), SimpleHTTPServer.SimpleHTTPRequestHandler)

    and access the page on any device your network connected. This is very handy in cases like "you have to test HTML5 GeoLocation API in a mobile, and Chrome restricts the API in secure connections only".

Gist: https://gist.github.com/dergachev/7028596

http://www.piware.de/2011/01/creating-an-https-server-in-python/

这很简单,

只需运行以下命令

sudo a2enmod ssl


sudo service apache2 restart


sudo a2ensite default-ssl.conf

就这样,你完成了。

如果你想强制使用SSL(总是使用https),编辑文件:

sudo nano /etc/apache2/sites-available/000-default.conf

加上这一行

<VirtualHost *:80>
. . .


Redirect "/" "https://your_domain_or_IP/"


. . .
</VirtualHost>

然后重新启动

sudo service apache2 restart

这个HowTo for CentOS很容易遵循,只需要大约5分钟:https://wiki.centos.org/HowTos/Https

我不会在这里详细介绍每一步,但主要步骤如下:

1)。安装apache的openssl模块(如果尚未安装)

2)。生成自签名证书

——在这一点上,你应该能够成功地访问https://localhost

3)。如果需要,可以设置一个虚拟主机

对于那些使用macOS的人来说,这是一个很好的指南https://getgrav.org/blog/macos-sierra-apache-multiple-php-versions来设置你的本地web开发环境。在第三部分https://getgrav.org/blog/macos-sierra-apache-ssl Andy Miller解释了如何使用自签名证书设置apache:

这是关键命令:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt

但有几个步骤你需要遵循,所以检查,祝你好运!;)

为了保护发送到web服务器和从web服务器发送的信息的安全,启用客户端和服务器之间的通信加密是一个好主意。这通常被称为SSL

因此,让我们在Apache2上使用自签名证书设置HTTPS。我将列出你应该遵循的步骤:

  • 在你的机器上安装apache2 web server。对于linux机器,打开终端并输入

Sudo apt-get安装apache2

  • 安装成功后,可以通过命令检查apache2服务的状态

Sudo服务apache2状态

它应该输出

apache2 service status

  • 导航到浏览器并输入

http://localhost:80

验证您获得了apache2的默认页面,如下所示。

default output of apache2

  • 为了加密web连接,我们需要CA(证书颁发机构)的证书,或者我们可以使用自签名证书。让我们使用以下命令创建一个自签名证书。

Openssl req -x509 -newkey rsa:2048 -keyout mykey。输入mycert。Pem -days 365 -nodes

请按如下所示填写相关信息。

create self - signed certificate using openssl

mykey.keymycert.pem应该在你当前的工作目录中创建。

  • 如果我们把证书和密钥移到一个公共的地方,apache2 web服务器就很容易找到它们了。让我们执行下面的命令

Sudo cp mycert。pem /etc/ssl/certs

Sudo cp mykey。关键/etc/ssl/private

  • 让我们在服务器上启用SSL模式

Sudo a2enmod SSL

它应该像这样输出

enable ssl

  • 让我们将apache2配置为使用上面生成的自签名证书和密钥。

Sudo vi /etc/apache2/sites-available/default-ssl.conf

请找到这两行,并用您的证书和密钥路径替换它们。

最初的

default-conf

最后

after config changes

  • 启用站点

cd /etc/apache2/sites-available /

Sudo a2ensite default-ssl.conf

  • 重新启动apache2服务

Sudo服务apache2重启

  • 在HTTPS上验证apache2 web服务器。再次打开浏览器并输入

https://localhost:443

它应该输出如下内容,并警告您即将查看的页面不安全,因为我们已经使用自签名证书配置了服务器。

enter image description here

  • 恭喜你已经将apache2配置为HTTPS端点,现在单击先进的——> 添加例外——> 确认安全例外,你将再次看到默认页面。

page after adding exception

这适用于Windows 10和Apache24:

1 -在C:/Apache24/conf/httpd.conf的底部添加这个

Listen 443
<VirtualHost *:443>
DocumentRoot "C:/Apache24/htdocs"
ServerName localhost
SSLEngine on
SSLCertificateFile "C:/Apache24/conf/ssl/server.crt"
SSLCertificateKeyFile "C:/Apache24/conf/ssl/server.key"
</VirtualHost>

2 -在C:/Apache24/conf/ssl文件夹中添加server.crtserver.key文件。请参阅本页上的其他答案,以找到这两个文件。

就是这样!

博士tl;

ssh -R youruniquesubdomain:80:localhost:3000 serveo.net

你的本地环境可以从https://youruniquesubdomain.serveo.net访问

Serveo是最好的

  • 没有注册。
  • 没有安装。
  • HTTPS。
  • 全球范围内访问。
  • 您可以指定自定义修复子域。
  • 你可以自己托管它,这样你就可以使用自己的域名,即使服务宕机,你也可以为未来做准备。

当我发现这项服务时,我简直不敢相信。它提供了一切,而且是最容易使用的。如果有这样一个简单无痛的工具可以解决所有问题……

在Windows 10上运行Apache。我无法让Chrome浏览器信任西蒙在顶部回答中的证书。最后我使用PowerShell生成了一个自签名证书。

步骤1 -生成自签名证书

PowerShell的< >强 < / p >
New-SelfSignedCertificate -DnsName "localhost" -CertStoreLocation "cert:\LocalMachine\My" 1 < a href = " https://stackoverflow.com/a/44164653/3233729 " > < / >

步骤2 -配置并导出证书

在Windows搜索栏中输入Certificate,单击建议的Manage Computer Certificates控制面板项。

从出现的证书管理程序(certlm)中,你现在应该在Personal >> Certificates下看到一个localhost密钥。

我将这个证书复制到Trusted Root Certification Authorities中。说实话,我不确定这是否有必要。

选择新复制的证书,双击它(本地主机证书)。在Certificate模式中,单击Details选项卡,然后单击Copy to File...按钮。

这将弹出导出向导,我选择导出私钥,单击下一步。我还选择Export all extended properties(同样,我不确定这是否有必要)。我选择使用一个简单的密码(pass)和默认加密。 选择要导出到的文件夹并命名该文件。如果需要,您总是可以移动和重命名该文件。为了简单起见,让我们将其复制到Apache安装下的conf文件夹(在我的例子中:C:\apache\conf),并将文件命名为myCert(结果文件将是.pfx文件)

第3步-转换.pfx文件使用Apache

从这里开始,我基本上遵循了教程在这里,但我将在这里添加说明(为我们的设置进行了调整),以防网站崩溃。

< p > 打开/apache/conf/文件夹中的命令提示符
执行以下命令:< em >注意:假设在apache根文件夹的bin文件夹中有openssl.exe(这应该是标准/默认)

..\bin\openssl pkcs12 -in myCert.pfx -nocerts -out privateKey.pem

这将提示您输入密码,输入您在导出.pfx文件时为步骤2输入的密码。在我的例子中,这是pass。我为PEM短语输入了相同的密码,并再次进行验证。这将在conf文件夹中创建一个名为privateKey.pem的新文件。

然后,运行

..\bin\openssl rsa -in privateKey.pem -out private.pem
你将再次提示输入密码(Enter pass phrase for privateKey.pem:),使用你为privateKey.pem设置的密码。(在我的例子中,pass)
你应该看到一条消息,上面写着writing RSA key,并且在你的conf/文件夹中有一个名为private.pem的新文件。这将是您的SSLCertificateKeyFile。 < / p >

现在要生成相应的服务器证书。运行:

..\bin\openssl pkcs12 -in myCert.pfx -clcerts -nokeys -out EntrustCert.pem

这将提示您输入密码,输入您在导出.pfx文件时为步骤2输入的密码。输入它,你现在会在你的conf文件夹中有一个名为EntrustCert.pem的文件。这是您的SSLCertificateFile

步骤4 -配置httpd.conf

使用创建的新文件作为服务器的密钥和证书。请确保将文档根目录更改为文件所在的位置!

ServerName localhost:80
Protocols h2 h2c http/1.1
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>


<VirtualHost _default_:443>
ServerName localhost:443
DocumentRoot ${SRVROOT}/htdocs/MYSITE
SSLEngine on
SSLCertificateFile "${SRVROOT}/conf/EntrustCert.pem"
SSLCertificateKeyFile "${SRVROOT}/conf/private.pem"
</VirtualHost>

同样在httpd.conf中:

  • 确保LoadModule ssl_module modules/mod_ssl.so没有注释(前面没有#)
  • 取消LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
  • 取消LoadModule http2_module modules/mod_http2.so
  • 取消注释Include conf/extra/httpd-ssl.conf (注意:确保文件在那里!)

我也有curl和开放ssl库包括:

# load curl and open ssl libraries
LoadFile "C:\php\libeay32.dll"
LoadFile "C:\php\ssleay32.dll"
LoadFile "C:\php\libssh2.dll"
这些模块不应该是必需的,但我会注意到我已经启用了它们 LoadModule rewrite_module modules/mod_rewrite.so < br > LoadModule filter_module modules/mod_filter.so < br > LoadModule deflate_module modules/mod_deflate.so < / p >

步骤5 -配置httpd-ssl.conf

conf/文件夹的extra/文件夹中,你应该看到一个名为httpd-ssl.conf的文件。

< p > 5。改变DocumentRoot - 将DocumentRoot从默认值更改为文件所在的目录 < p > 5 b。改变ServerName - 将ServerName从默认值(类似www.example.com:443)更改为localhost:443

< p > 5 c。改变SSLCertificateFile < br > 将SSLCertificateFile从默认值(${SRVROOT}/conf/server.crt)更改为${SRVROOT}/conf/EntrustCert.pem

< p > 5 c。改变SSLCertificateKeyFile < br > 将SSLCertificateKeyFile从默认值(${SRVROOT}/conf/server.key)更改为${SRVROOT}/conf/private.pem

所有这些都在<VirtualHost _default_:443>标记中。

#   General setup for the virtual host
DocumentRoot "${SRVROOT}/htdocs/MYSITE"
ServerName localhost:443
ServerAdmin admin@example.com
ErrorLog "${SRVROOT}/logs/error.log"
TransferLog "${SRVROOT}/logs/access.log"


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


#   Server Certificate:
#   Point SSLCertificateFile at a PEM encoded certificate.  If
#   the certificate is encrypted, then you will be prompted for a
#   pass phrase.  Note that a kill -HUP will prompt again.  Keep
#   in mind that if you have both an RSA and a DSA certificate you
#   can configure both in parallel (to also allow the use of DSA
#   ciphers, etc.)
#   Some ECC cipher suites (http://www.ietf.org/rfc/rfc4492.txt)
#   require an ECC certificate which can also be configured in
#   parallel.
SSLCertificateFile "${SRVROOT}/conf/EntrustCert.pem"
#SSLCertificateFile "${SRVROOT}/conf/server-dsa.crt"
#SSLCertificateFile "${SRVROOT}/conf/server-ecc.crt"


#   Server Private Key:
#   If the key is not combined with the certificate, use this
#   directive to point at the key file.  Keep in mind that if
#   you've both a RSA and a DSA private key you can configure
#   both in parallel (to also allow the use of DSA ciphers, etc.)
#   ECC keys, when in use, can also be configured in parallel
SSLCertificateKeyFile "${SRVROOT}/conf/private.pem"
#SSLCertificateKeyFile "${SRVROOT}/conf/server-dsa.key"
#SSLCertificateKeyFile "${SRVROOT}/conf/server-ecc.key"

重新启动Apache

在做了这些更改之后,你应该能够重新启动Apache并导航到https://localhost,而不会出现安全警告和小挂锁!

 secure localhost

我希望这能帮助到一些人!😊

< p > 来源:
1.) Auri Rahimzadeh对创建自签名证书的回答
2) 委托数据卡-如何将.pfx转换为Apache服务器使用? < / p >

< h2 > 2021 < / h2 >更新

我发布这个答案,因为我自己也在努力解决这个问题,Chrome更新了他们的安全要求主题备选名称 .,很多帖子都没有,因为当他们作为一个答案发布时,它是不需要的。我假设WAMP已经安装了。

步骤1

下载OpenSSL Light并安装


**步骤2(可选)** .单击“确定”

虽然这部分是可选的,但它使以后更容易执行命令。如果跳过此步骤,则必须提供执行该命令的openssl.exe的完整路径。如果你喜欢设置它,那么更新环境变量中的openssl.exe路径。

环境变量->系统变量->路径→编辑→新→ c:\Program Files\ OpenSSL-Win64 \ bin < / p >


步骤3 * * * *

c:/wamp64/bin/apache/apache2.4.27(your version number)/conf/目录下创建一个名为“关键”的文件夹。

为你的CA < >强MyCompanyCA.cnf < / >强创建配置文件(你可以根据需要修改它):

[ req ]
distinguished_name  = req_distinguished_name
x509_extensions     = root_ca


[ req_distinguished_name ]
countryName             = Country Name (2 letter code)
countryName_min         = 2
countryName_max         = 2
stateOrProvinceName     = State or Province Name (full name)
localityName            = Locality Name (eg, city)
0.organizationName      = Organization Name (eg, company)
organizationalUnitName  = Organizational Unit Name (eg, section)
commonName              = Common Name (eg, fully qualified host name)
commonName_max          = 64
emailAddress            = Email Address
emailAddress_max        = 64


[ root_ca ]
basicConstraints            = critical, CA:true

为web服务器证书创建扩展配置文件< >强MyCompanyLocalhost.ext < / >强:

subjectAltName = @alt_names
extendedKeyUsage = serverAuth


[alt_names]
DNS.1   = localhost
DNS.2   = mycy.mycompany.com

步骤4 * * * *

按指定顺序执行以下命令生成密钥和证书:

openssl req -x509 -newkey rsa:2048 -out MyCompanyCA.cer -outform PEM -keyout MyCompanyCA.pvk -days 10000 -verbose -config MyCompanyCA.cnf -nodes -sha256 -subj "/CN=MyCompany CA"
openssl req -newkey rsa:2048 -keyout MyCompanyLocalhost.pvk -out MyCompanyLocalhost.req -subj /CN=localhost -sha256 -nodes
openssl x509 -req -CA MyCompanyCA.cer -CAkey MyCompanyCA.pvk -in MyCompanyLocalhost.req -out MyCompanyLocalhost.cer -days 10000 -extfile MyCompanyLocalhost.ext -sha256 -set_serial 0x1111

因此,你将有MyCompanyCA.cerMyCompanyLocalhost.cerMyCompanyLocalhost.pvk文件。


第5步* * * *

下面安装MyCompanyCA.cer

控制面板->管理用户证书->受信任的根 认证机构->证书< / p >

要安装MyCompanyLocalhost.cer,只需双击它。


第6步* * * *

打开c:/wamp64/bin/apache/apache2.4.27(your version number)/conf/httpd.conf取消注释(删除#)下面3行:

LoadModule ssl_module modules/mod_ssl.so
Include conf/extra/httpd-ssl.conf
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

第7步* * * *

打开c:/wamp64/bin/apache/apache2.4.37/conf/extra/httpd-ssl.conf并将所有参数更改为如下所示:

Directory "c:/wamp64/www"
DocumentRoot "c:/wamp64/www"
ServerName localhost:443
ServerAdmin admin@example.com
ErrorLog "c:/wamp64/bin/apache/apache2.4.27/logs/error.log"
TransferLog "c:/wamp64/bin/apache/apache2.4.27/logs/access.log"
SSLCertificateFile "c:/wamp64/bin/apache/apache2.4.27/conf/key/MyCompanyLocalhost.cer"
SSLCertificateKeyFile "c:/wamp64/bin/apache/apache2.4.27/conf/key/MyCompanyLocalhost.pvk"
SSLSessionCache "shmcb:c:/wamp64/bin/apache/apache2.4.27/logs/ssl_scache(512000)"
CustomLog "c:/wamp64/bin/apache/apache2.4.27/logs/ssl_request.log" \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

<强>注意:< / >强 这是棘手的部分。如果在编辑此文件时犯了任何小错误,SSL将无法工作。编辑之前先复制一份。


* *步骤8 * *

重新启动Wamp和Chrome。Localhost现在是安全的:https://localhost

我想在@CodeWarrior的非常好的回答中添加一些东西,这在Chrome上完美地工作,但对于Firefox需要额外的步骤。

由于Firefox不推送CA证书,而Windows在默认情况下会推送CA证书,因此您需要继续about:config,向下滚动到security.enterprise_roots.enabled,并将其更改为true。

现在,您的证书在Firefox上也应该是有效的。

当然,这仅用于开发目的,因为ssl信任是一个关键的安全问题,只有在知道其影响时才更改此设置。