如何在localhost上为Apache提供HTTPS?

Ken*_*nC. 189 apache ssl https localhost

我被要求在本地主机上的Apache上使用自签名证书设置HTTPS,但我该如何实际做到这一点?我根本不知道.

Sim*_*ast 129

我刚试过这个 - 我需要在Windows上的localhost Apache上测试一些开发代码.这比WAAAY更困难.但是,经过多次脱毛后,这些步骤成功地完成了......

我发现我的Apache安装附带有openssl.exe帮助.如果您没有副本,则需要下载它.我的副本在Apache2\bin文件夹中,我在下面引用它.

脚步:

  1. 确保您对Apache conf文件夹具有写入权限
  2. Apache2\conf文件夹中打开命令提示符
  3. 类型
    ..\bin\openssl req -config openssl.cnf -new -out blarg.csr -keyout blarg.pem
  4. 您可以将所有问题留空,除了:

    • PEM密码短语:临时密码,如"密码"
    • 通用名称:服务器的主机名

  5. 完成后,键入
    ..\bin\openssl rsa -in blarg.pem -out blarg.key

  6. 键入以下内容生成自签名证书:
    ..\bin\openssl x509 -in blarg.csr -out blarg.cert -req -signkey blarg.key -days 365

  7. 打开Apache的conf\httpd.conf文件并确保启用SSL模块 - 此行的开头应该没有哈希:
    LoadModule ssl_module modules/mod_ssl.so

  8. 某些Apache安装将SSL配置放在单独的文件中.如果是这样,请确保包含SSL conf文件.在我的情况下,我不得不取消注释这一行:
    Include conf/extra/httpd-ssl.conf

  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"

  10. 重启Apache.

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

希望你能做到这一点.随意使用任何其他有用的信息更新此帖子.

(截图由Neil Obremski和他的有用文章提供 - 虽然现在已经过时了.)

  • 我必须在我的httpd.conf中取消注释以下内容才能正常工作:LoadModule socache_shmcb_module modules/mod_socache_shmcb.so (6认同)
  • 为了生成.pem和.key文件,我必须在第2步设置2个环境变量:set OPENSSL_CONF = C:\ path\to\apache\Apache2.4.4\conf\openssl.cnf set RANDFILE = C:\路径\为\ apache的\ Apache2.4.4 \的conf\.rnd (5认同)
  • 谢谢.我还必须将ErrorLog,TransferLog和CustomLog指令编辑为有效路径,否则Apache将无法启动. (2认同)

sud*_*dip 55

我使用ngrok(https://ngrok.com/).ngrok是一个命令行工具,可以为localhost创建隧道.它创建http和https连接.下载后,需要运行以下命令:

ngrok http 80
Run Code Online (Sandbox Code Playgroud)

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

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

http://a_hexadecimal_number.ngrok.com
https://a_hexadecimal_number.ngrok.com
Run Code Online (Sandbox Code Playgroud)

现在,两个URL都指向localhost.

  • 尽管这很有用,但允许您的开发计算机访问开放互联网似乎非常不安全。使用这样的东西会让你被一个有安全意识的雇主解雇。 (5认同)
  • @Pacerier我不打算在服务器上使用它.我在localhost上使用它(Bcz我的网络提供商给了我一个动态IP).我第一次用它来进行贝宝IPN测试,它运行得很好.我想知道为什么有人会在服务器上使用它以及用于什么目的. (2认同)

Ani*_*pta 23

这是最简单的方法

首先将这些server.crtserver.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>
Run Code Online (Sandbox Code Playgroud)

  • 我想知道从不受信任的来源下载*.crt*.key文件而不是生成自己的文件是多么安全/危险. (16认同)
  • 解释如何生成这些文件会很棒.因为从未知来源下载文件是一种不好的做法,但也因为那种链接会在某些时候中断. (7认同)
  • @PetrPeller我们正在为本地开发设置https,所以为什么要安全/危险 (4认同)
  • 我还必须在(/etc/apache2/httpd.conf)中启用模块LoadModule ssl_module libexec / apache2 / mod_ssl.so。 (2认同)
  • 本教程很好https://www.digitalocean.com/community/tutorials/how-to-create-a-ssl-certificate-on-apache-for-ubuntu-14-04 (2认同)

Din*_*mar 11

为了保护发送到Web服务器和从Web服务器发送的信息的安全性,最好对客户端和服务器之间的通信进行加密.这通常称为SSL.

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

  • 在您的计算机上安装apache2 Web服务器.对于linux机器打开终端并输入

sudo apt-get install apache2

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

sudo service apache2 status

它应该输出

apache2服务状态

  • 导航到浏览器并键入

HTTP://本地主机:80

验证您是否像这样获得apache2的默认页面.

apache2的默认输出

  • 对于加密Web连接,我们需要来自CA(证书颁发机构)的证书,或者我们可以使用自签名证书.让我们使用以下命令创建自签名证书.

openssl req -x509 -newkey rsa:2048 -keyout mykey.key -out mycert.pem -days 365 -nodes

请填写相应信息,如下所示.

使用openssl创建自签名证书

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

  • 如果在一个公共场所移动证书和密钥并且apache2 web服务器很容易找到它们将会很好.所以让我们执行以下命令

sudo cp mycert.pem/etc/ssl/certs

sudo cp mykey.key/etc/ssl/private

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

sudo a2enmod ssl

它应该像这样输出

启用ssl

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

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

请找到这两行,并将其替换为您的证书和密钥路径.

初始

默认的conf

最后

配置更改后

  • 启用该站点

cd/etc/apache2/sites-available /

sudo a2ensite default-ssl.conf

  • 重启apache2服务

sudo service apache2 restart

  • 验证HTTPS上的apache2 Web服务器.再次打开浏览器并输入

https://开头本地主机:443

它应输出类似这样的内容,并警告您要查看的页面不安全,因为我们已使用自签名证书配置服务器.

在此输入图像描述

  • 恭喜您已使用HTTPS端点配置了apache2,现在单击高级 - > 添加例外 - > 确认安全例外,您将再次看到默认页面.

添加例外后的页面


cui*_*ing 9

Windows + Apache 2.4,例如:

  1. 取消注释httpd.conf文件中的ssl_module .

    LoadModule ssl_module modules/mod_ssl.so
    
    Run Code Online (Sandbox Code Playgroud)
  2. httpd.conf文件中的80端口一样监听443端口.

    Listen 80
    Listen 443
    
    Run Code Online (Sandbox Code Playgroud)
  3. 取消注释在httpd.conf文件中包含虚拟主机.

    # Virtual hosts
    Include conf/extra/httpd-vhosts.conf
    
    Run Code Online (Sandbox Code Playgroud)
  4. 在您的虚拟主机中添加VirtualHost 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>
    
    Run Code Online (Sandbox Code Playgroud)

只有端口号443SSL......行与普通的http配置不同.

保存配置文件并重启apache服务.然后你可以访问https:// localhost /

网络浏览器会在第一时间警告您它不安全,只需选择继续.


Pet*_*ark 8

假设你有一个方便的openssl安装,它实际上非常简单.(你在哪个平台?)

假设您使用的是linux/solaris/mac os/x,Van的Apache SSL/TLS mini-HOWTO有一个很好的演练,我不会在这里重现.

但是,执行摘要是您必须创建自签名证书.由于您正在为localhost运行apache,可能是为了开发(即不是公共Web服务器),您将知道您可以信任自签名证书并且可以忽略浏览器将向您发出的警告.

  • 不.您将自己制作自签名证书.你有apache httpd + ssl设置吗?你需要ssl才能做到这一点.这个网站:http://rubayathasan.com/tutorial/apache-ssl-on-windows/有关于让ssl进入Windows的良好信息.你会做一些命令行工作,但无论如何这对你有好处.:-) (3认同)
  • 链接已死:( (3认同)

Cod*_*ior 6

2021 更新

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

第1步

下载OpenSSL Light 并安装


**第 2 步(可选)**

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

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


**第 3 步**

在目录中创建一个名为“key”的文件夹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
Run Code Online (Sandbox Code Playgroud)

为您的 Web 服务器证书创建扩展配置文件MyCompanyLocalhost.ext

subjectAltName = @alt_names
extendedKeyUsage = serverAuth

[alt_names]
DNS.1   = localhost
DNS.2   = mycy.mycompany.com
Run Code Online (Sandbox Code Playgroud)
**第四步**

按给定顺序执行这些命令以生成密钥和证书:

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
Run Code Online (Sandbox Code Playgroud)

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


**第 5 步**

安装MyCompanyCA.cer

控制面板 -> 管理用户证书 -> 受信任的根证书颁发机构 -> 证书

要安装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
Run Code Online (Sandbox Code Playgroud)
**第 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"
Run Code Online (Sandbox Code Playgroud)

注意: 这是棘手的部分。如果您在编辑此文件时犯了任何小错误,SSL 将不起作用。在编辑之前制作一份副本。


**第 8 步**

重新启动 Wamp 和 Chrome。本地主机现在是安全的:https://localhost


Ste*_*ieQ 5

在此处在 Windows 10 上运行 Apache。我无法让 Chrome 信任西蒙在最佳答案中制作的证书。我最终做的是使用 PowerShell 生成自签名证书。

步骤 1 - 生成自签名证书

在 PowerShell
New-SelfSignedCertificate -DnsName "localhost" -CertStoreLocation "cert:\LocalMachine\My" 1

步骤 2 - 配置和导出证书

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

从出现的证书管理程序 (certlm) 中,您现在应该localhostPersonal >> Certificates.

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

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

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

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

从这里开始,我基本上遵循了此处的教程,但我将在此处添加说明(针对我们的设置进行了调整),以防该站点出现故障。

打开命令提示符在/apache/conf/文件夹中
运行以下命令:注:这里假设你有openssl.exebin在Apache根文件夹中的文件夹(这应该是标准/默认)

..\bin\openssl pkcs12 -in myCert.pfx -nocerts -out privateKey.pem
Run Code Online (Sandbox Code Playgroud)

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

然后,运行

..\bin\openssl rsa -in privateKey.pem -out private.pem
Run Code Online (Sandbox Code Playgroud)

系统将再次提示您输入密码 ( Enter pass phrase for privateKey.pem:),请使用您为 设置的密码privateKey.pem。(就我而言,pass
您应该会看到一条消息,上面写着您的文件夹中writing RSA key调用private.pem了一个新文件conf/这将是您的 SSLCertificateKeyFile。

现在生成相应的服务器证书。跑:

..\bin\openssl pkcs12 -in myCert.pfx -clcerts -nokeys -out EntrustCert.pem
Run Code Online (Sandbox Code Playgroud)

这将提示您输入密码,输入您在导出.pfx文件时为步骤 2 输入的内容。进入它,你现在有一个名为EntrustCert.pem您的conf文件夹中。 这是您的 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>
Run Code Online (Sandbox Code Playgroud)

也在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 和 open ssl 库:

# load curl and open ssl libraries
LoadFile "C:\php\libeay32.dll"
LoadFile "C:\php\ssleay32.dll"
LoadFile "C:\php\libssh2.dll"
Run Code Online (Sandbox Code Playgroud)

这些模块不是必需的,但我会注意到我启用了它们:
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule filter_module modules/mod_filter.so
LoadModule deflate_module modules/mod_deflate.so

第 5 步 - 配置 httpd-ssl.conf

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

5a. 更改DocumentRoot-DocumentRoot将默认值更改为文件所在的目录。

5b. 更改ServerName-ServerName将默认值(类似于www.example.com:443)更改为localhost:443

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

5c。将SSLCertificateKeyFile
更改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"
Run Code Online (Sandbox Code Playgroud)

重启阿帕奇

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

受保护的本地主机

我希望这可以帮助别人!

来源:
1.) Auri Rahimzadeh 对创建自签名证书的回答
2.) Entrust Datacard - 如何转换 .pfx 以与 Apache 服务器一起使用?