应用程序安全保障全流程指南
1. 安装OpenSSL
在保障应用程序安全的过程中,第一步是在你的机器上安装OpenSSL。OpenSSL是一个开源的加密工具,用于生成私钥和证书签名请求(CSR)。你可以通过在命令行输入 openssl 来检查机器是否已经安装了它。如果打开了OpenSSL提示符而没有抛出错误,那么你就可以开始下一步了。
- 若未安装OpenSSL,Mac/Linux用户可从 www.openssl.org/source 下载;Windows用户可从 www.openssl.org/related/binaries.html 下载二进制文件。
- 若安装遇到问题,可参考 http://wiki.openssl.org/index.php/Compilation_and_Installation 。
下面是安装和检查OpenSSL的流程:
graph LR
A[开始] --> B{检查OpenSSL是否安装}
B -- 已安装 --> C[可开始后续操作]
B -- 未安装 --> D{选择系统}
D -- Mac/Linux --> E[从www.openssl.org/source下载]
D -- Windows --> F[从www.openssl.org/related/binaries.html下载]
E --> G{安装是否成功}
F --> G
G -- 是 --> C
G -- 否 --> H[参考http://wiki.openssl.org/index.php/Compilation_and_Installation解决]
H --> G
2. 创建密钥和CSR
安装完成后,你需要生成一个私钥和相应的证书签名请求(CSR)。在命令行界面输入以下命令:
openssl req -new -newkey rsa:2048 -nodes -keyout photoalbums.key -out photoalbums.csr
你可以使用与要获取证书的域名相关的文件名,而不是 photoalbums.key 和 photoalbums.csr 。在CLI中,你会被提示填写一些问题,具体如下:
| 字段 | 说明 | 填写建议 |
| ---- | ---- | ---- |
| Country Name (2 letter code) [AU] | 国家代码 | 输入你的国家代码 |
| State or Province Name (full name) [Some-State] | 州或省的全名 | 输入你的州或省的全名 |
| Locality Name (e.g., city) [] | 所在地区(如城市) | 输入你的城市名称 |
| Organization Name (e.g., company) [Internet Widgits Pty Ltd] | 组织名称(如公司) | 输入你的组织名称 |
| Organizational Unit Name (e.g., section) [] | 组织单位名称(如部门) | 可根据实际情况填写 |
| Common Name (e.g., server FQDN or YOUR name) [] | 通用名称 | 输入不带 www 的域名 |
| Email Address [] | 电子邮件地址 | 输入你的电子邮件地址 |
填写完这些必填字段后,会提示你输入可选字段,直接按回车键跳过即可。完成后,你应该在当前工作目录中得到一个 .key 和 .csr 文件。
3. 请求证书
接下来,你需要将密钥和证书签名请求提交给证书颁发机构(CA)。选择哪个CA提供商完全取决于你,你可以参考 www.dmoz.org/Computers/Security/Public_Key_Infrastructure/PKIX/Tools_and_Services/Third_Party_Certificate_Authorities/ 中的部分列表。
- 通常使用销售由CA签名的证书的供应商会更方便。根据你注册域名的公司,它可能也提供证书服务。例如,NameCheap是一个信誉良好的供应商,你可以通过他们获得Comodo签名的证书,大约每年9美元,整个过程大约需要十分钟。如果你只是想获得一个用于开发的有效证书,这可能是最简单的途径。
- 在SSL证书供应商处,首先选择一个证书套餐/价格。付款后,开始请求证书和验证域名的过程。你会被要求提供CSR,你需要在纯文本编辑器中打开 .csr 文件,其内容如下:
-----BEGIN CERTIFICATE REQUEST-----
FYvKlArPvGZYWNmCMeNDjwa3pxtHWVu6CeXsXUsU4Axwaqtc60VMofEoQCqfwCi+
CDLLoSnwMQIDAQABoAAwDQYJKoZIhvcNAQEFBQADggEBAAzFDJs+FNdUgvNmdsBO
5qeETlUtIHyw9rDLSwF/wvMWS/86uSyuq3wR7GiDPIYSjs5dIWqmAleyroKRaMZd
FzAVBgNVBAMTDmNsb3VkeWV5ZXMubmV0MRwwGgYJKoZIhvcNAQkBFg1hZGFtQGNy
5qeETlUtIHyw9rDLSwF/wvMWS/86uSyuq3wR7GiDPIYSjs5dIWqmAleyroKRaMZd
PyrafU/eidGboCv83NYMSUUyJ0xDVCbIe4EoJUnpOmzu7e07vZDbB5cZDCaJWpuo
l5tf9361gLcJrKxwiHuPffipf9vv4q0M1jwdNgKtUNGSq11FdiYqlfXR87iSTMEI
nNuScyAUWgX3yXjeGhCszUIfNMbGEHL3oOKsWvpYP/Kj+ESr5DDrNujHol9n3CQz
CDLLoSnwMQIDAQABoAAwDQYJKoZIhvcNAQEFBQADggEBAAzFDJs+FNdUgvNmdsBO
5qeETlUtIHyw9rDLSwF/wvMWS/86uSyuq3wR7GiDPIYSjs5dIWqmAleyroKRaMZd
PyrafU/eidGboCv83NYMSUUyJ0xDVCbIe4EoJUnpOmzu7e07vZDbB5cZDCaJWpuo
l5tf9361gLcJrKxwiHuPffipf9vv4q0M1jwdNgKtUNGSq11FdiYqlfXR87iSTMEI
5qeETlUtIHyw9rDLSwF/wvMWS/86uSyuq3wR7GiDPIYSjs5dIWqmAleyroKRaMZd
PyrafU/eidGboCv83NYMSUUyJ0xDVCbIe4EoJUnpOmzu7e07vZDbB5cZDCaJWpuo
l5tf9361gLcJrKxwiHuPffipf9vv4q0M1jwdNgKtUNGSq11FdiYqlfXR87iSTMEI
SevmFhb6EkqLe1sEeDODqKj/FcDZYYjISNEe6ftwPGdBEivRXJpHIH/11wQRQuSw
7ws=
-----END CERTIFICATE REQUEST-----
选择文件的全部内容并复制粘贴到提示的字段中。你可能还会被要求选择Web服务器类型,如果有选项,选择 Apache+OpenSSL 。如果证书有效,域名将从你生成CSR时输入的通用名称中自动提取。CA随后会尝试验证域名,可能会向注册为域名管理员的电子邮件地址发送带有验证码的电子邮件,你可以通过在命令行输入 whois yourdomain.com 并在响应中找到 Admin Email 来获取该地址。也可以选择为请求证书的域名的电子邮件地址。通常会通过电子邮件进行验证。
当你的证书请求获得批准后,你将从CA收到几个扩展名为 .crt 的文件,其中一个是根CA证书,另一个是你的SSL证书(如 yourdomain_com.crt ),此外还有一个或多个中间CA证书。
4. 转换证书格式
在将这些证书与AWS服务一起使用之前,需要解决兼容性问题,因为AWS只接受X.509 PEM格式的证书。可以使用OpenSSL将证书转换为PEM格式。
- 转换私钥:在CLI中执行以下命令并按回车键:
openssl rsa -in photoalbums.key -text > aws-private.pem
这是在你的机器上生成的私钥,将上传到AWS。
- 转换公钥:输入以下命令,将 yourdomain_com 替换为你的证书的实际文件名:
openssl x509 -inform PEM -in yourdomain_com.crt > aws-public.pem
- 创建证书链:证书链是通过按顺序拼接中间证书颁发机构的证书来生成的,反映了从我们的域名通过中间CA到根CA的信任链。收到证书时,应该会有一个有序列表,例如:
- Root CA Certificate:
AddTrustExternalCARoot.crt - Intermediate CA Certificate:
CANameAddTrustCA.crt - Intermediate CA Certificate:
CANameDomainValidationSecureServerCA.crt - Your PositiveSSL Certificate:
yourdomain_com.crt
在创建证书链时,需要注意中间CA证书的顺序并反转它们。在命令行输入以下命令:
- Root CA Certificate:
(openssl x509 -inform PEM -in CANameDomainValidationSecureServerCA.crt; openssl x509 -inform PEM -in CANameAddTrustCA.crt) >> aws-certchain.pem
这样就将两个中间CA证书合并到一个名为 aws-certchain.pem 的 .pem 文件中。
5. 配置AWS命令行界面(CLI)
由于IAM仪表板中没有SSL视图,需要使用AWS命令行界面将证书上传到AWS。首先要在你的机器上安装和配置AWS CLI工具,安装说明可参考 http://docs.aws.amazon.com/cli/latest/userguide/installing.html 。
- 配置权限 :可以使用 photoadmin IAM用户并生成一个访问密钥用于命令行界面。具体步骤如下:
1. 导航到AWS控制台的IAM,从左侧导航栏选择 Users 。
2. 选择 photoadmin 用户,在用户详细信息视图中点击 Attach Policy 。
3. 选择托管策略,滚动或在 Policy Type 过滤字段中输入 iam 进行过滤,找到 IAMFullAccess 并勾选复选框。
4. 点击 Attach Policy 附加策略并返回用户详细信息视图。此时用户在用户级别和组级别都有策略。
5. 点击 Show Policy 可以查看策略声明,如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iam:*",
"Resource": "*"
}
]
}
6. 在 `Security Credentials` 标题下,点击 `Manage Access Keys`,在弹出的模态窗口中点击 `Create Access Key`,然后点击 `Download Credentials` 保存本地副本。
- 配置CLI使用凭证 :在命令行输入
aws configure,按提示操作:- 粘贴刚刚保存的凭证中的访问密钥并按回车键。
- 输入你的秘密访问密钥。
- 输入默认的AWS区域
us-east-1并按回车键。 - 留空默认输出格式并按回车键。
6. 上传SSL证书
完成上述所有配置后,执行以下命令上传证书并使其在CloudFront中可用:
aws iam upload-server-certificate --certificate-body file://aws-public.pem --private-key file://aws-private.pem --certificate-chain file://aws-certchain.pem --server-certificate-name yourdomain_com --path /cloudfront/www.yourdomain.com/
需要注意的是, --path 参数应设置为 /cloudfront/www.yourdomain.com/ (使用你的域名并包含末尾的斜杠), --server-certificate-name 值应为你的域名。 file:// 路径是相对的,如果需要使用绝对路径,使用 file:/// 。按下回车键后,可能会得到一个错误或类似以下的JSON响应:
{
"ServerCertificateMetadata": {
"ServerCertificateId": "ASCAJLNQBYPFYEYN5BQNU",
"ServerCertificateName": "yourdomain_com",
"Expiration": "2016-01-05T00:03:54Z",
"Path": "/cloudfront/www.yourdomain.com/",
"Arn": "arn:aws:iam::061246224738:server-certificate/cloudfront/www.yourdomain.com/yourdomain_com",
"UploadDate": "2015-01-05T01:04:36.593Z"
}
}
7. 在CloudFront中启用HTTPS
- 导航到AWS控制台的CloudFront,选择你的分发,在
General选项卡中点击Edit。 - 启用自定义SSL证书,将默认的CloudFront证书切换为自定义SSL证书,并从下拉列表中选择你的证书。选择自定义SSL证书时,需要决定是支持所有客户端还是仅支持支持服务器名称指示(SNI)的客户端。支持所有客户端需要请求访问,并且费用会比仅支持SNI的客户端高很多。除非你的应用程序有特定原因需要支持所有客户端,否则建议选择仅支持SNI的客户端。
- 点击右下角的
Yes, Edit。CloudFront分发设置的更改需要几分钟才能传播,你可以关注分发的状态字段,等待其从InProgress变为Deployed。完成后,在浏览器中访问你的Hello World页面,确保在URL前添加https://,此时你应该会在地址旁边看到那个令人安心的小锁图标。 - 目前虽然可以通过HTTPS连接到我们的域名,但这是可选的。可以在浏览器地址栏中输入仅使用
http的URL来验证,此时锁图标会消失。对于应用程序的某些部分,暂时这样可能没问题,但对于一些需要用户与应用程序交互的路径,需要安全会话。在CloudFront的分发中,选择Behaviors选项卡,会看到所有行为的查看器协议策略都设置为HTTP and HTTPS。需要为需要HTTPS连接和会话cookie的请求支持一些额外的行为,需要限制的路由如下:-
/users/login -
/users/register -
/users/logout -
/albums/upload -
/albums/delete -
/photos/upload -
/photos/delete
可以通过以下五个路径来实现目标: -
/users/login -
/users/register -
/users/logout -
/*/upload -
/*/delete
为这五个路径创建相同规则的行为,Origin应设置为ELB,Viewer Protocol Policy应设置为HTTPS Only,Allowed HTTP Methods应为GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE,Forward Headers和Forward Cookies应设置为All。完成后,注意起源的顺序很重要,将基于会话的行为排在顶部。
-
- 通常,在CloudFront中所做的更改需要几分钟才能传播。在此期间,还需要更改CloudFront中一个更隐蔽的设置。当将ELB添加为CloudFront分发的起源时,允许CloudFront仅通过HTTP与ELB通信,这意味着对CloudFront的HTTPS请求将变为对ELB的HTTP请求。为确保从全球的CloudFront边缘位置到美国东部数据中心的流量是加密的,此流量应通过HTTPS进行。选择
Origins选项卡,在Origin Protocol Policy列中可以看到此问题。选择你的ELB并点击Edit,在Origin Settings视图中,将Origin Protocol Policy从HTTP Only更改为Match Viewer,然后点击Yes, Edit。之后,对CloudFront的HTTP请求将通过HTTP转发到ELB,HTTPS请求也将通过HTTPS转发,这些更改也需要几分钟才能传播。
8. 在ELB中启用HTTPS
由于CloudFront边缘位置遍布全球,数据需要从CloudFront传输到不同区域的ELB。为了确保流量的安全性,必须确保到达CloudFront的HTTPS请求能够安全地转发到ELB,这意味着需要在ELB上安装SSL证书并配置为接受HTTPS请求。
- 监听HTTPS连接 :默认情况下,ELB配置为仅在端口80上监听未加密的HTTP请求。需要在ELB上打开端口443以允许HTTPS请求通过。
- 导航到EC2,从左侧导航栏选择 Load Balancers ,选择你的ELB实例,打开 Listeners 选项卡,会看到只有端口80是开放的。点击 Edit 为ELB的监听器添加HTTPS。
- 在弹出的模态窗口中,添加一个负载均衡器协议为 HTTPS (Secure HTTP) ,使用负载均衡器端口443,实例协议应为 HTTP ,实例端口应为80。在 SSL Certificate 列中,点击 Change ,选择 Choose an existing certificate 并选择你的证书。
通过以上步骤,你可以全面保障应用程序的安全,确保数据在传输过程中的加密和完整性。
应用程序安全保障全流程指南
9. 总结与回顾
为了更清晰地回顾整个应用程序安全保障的流程,我们可以通过以下表格来梳理关键步骤:
| 步骤 | 操作内容 | 关键命令或设置 |
| ---- | ---- | ---- |
| 安装OpenSSL | 检查机器是否已安装OpenSSL,未安装则根据系统下载安装 | Mac/Linux: www.openssl.org/source ;Windows: www.openssl.org/related/binaries.html ;检查命令: openssl |
| 创建密钥和CSR | 生成私钥和证书签名请求 | openssl req -new -newkey rsa:2048 -nodes -keyout photoalbums.key -out photoalbums.csr |
| 请求证书 | 选择证书颁发机构,提交CSR,完成域名验证 | 选择供应商,复制 .csr 文件内容;选择Web服务器类型: Apache+OpenSSL |
| 转换证书格式 | 将证书转换为X.509 PEM格式 | 私钥: openssl rsa -in photoalbums.key -text > aws-private.pem ;公钥: openssl x509 -inform PEM -in yourdomain_com.crt > aws-public.pem ;证书链: (openssl x509 -inform PEM -in CANameDomainValidationSecureServerCA.crt; openssl x509 -inform PEM -in CANameAddTrustCA.crt) >> aws-certchain.pem |
| 配置AWS命令行界面(CLI) | 安装配置AWS CLI,配置权限和凭证 | 权限配置:选择 photoadmin 用户,附加 IAMFullAccess 策略;凭证配置: aws configure |
| 上传SSL证书 | 将转换后的证书上传到AWS并使其在CloudFront中可用 | aws iam upload-server-certificate --certificate-body file://aws-public.pem --private-key file://aws-private.pem --certificate-chain file://aws-certchain.pem --server-certificate-name yourdomain_com --path /cloudfront/www.yourdomain.com/ |
| 在CloudFront中启用HTTPS | 启用自定义SSL证书,配置支持的客户端类型,设置特定路径的访问策略,更改起源协议策略 | 切换到自定义SSL证书;选择支持客户端类型;设置特定路径的 Viewer Protocol Policy 为 HTTPS Only ;将 Origin Protocol Policy 从 HTTP Only 更改为 Match Viewer |
| 在ELB中启用HTTPS | 在ELB上打开端口443,配置监听HTTPS连接 | 添加负载均衡器协议为 HTTPS (Secure HTTP) ,端口443;实例协议 HTTP ,端口80;选择SSL证书 |
下面是整个流程的mermaid格式流程图:
graph LR
A[开始] --> B[安装OpenSSL]
B --> C[创建密钥和CSR]
C --> D[请求证书]
D --> E[转换证书格式]
E --> F[配置AWS CLI]
F --> G[上传SSL证书]
G --> H[在CloudFront中启用HTTPS]
H --> I[在ELB中启用HTTPS]
I --> J[完成安全保障]
10. 常见问题与解决方案
在实施上述安全保障流程的过程中,可能会遇到一些常见问题,以下是一些问题及对应的解决方案:
- OpenSSL安装问题 :如果在安装OpenSSL时遇到困难,可以参考 http://wiki.openssl.org/index.php/Compilation_and_Installation 上的详细说明。
- 证书请求被拒 :证书请求被拒可能是由于域名验证失败。检查域名管理员的电子邮件地址是否正确,确保能够收到验证邮件并及时完成验证。也可以检查生成CSR时输入的信息是否准确,特别是通用名称字段。
- CloudFront配置问题 :如果在CloudFront中更改设置后长时间未生效,可能是由于配置更改传播需要时间。耐心等待几分钟,关注分发的状态字段,直到其从 InProgress 变为 Deployed 。如果问题仍然存在,检查配置是否正确,特别是路径设置和证书选择。
- ELB监听问题 :如果在ELB上添加HTTPS监听器后仍然无法通过HTTPS访问应用程序,检查SSL证书是否正确选择,端口配置是否无误。也可以检查安全组设置,确保端口443是开放的。
11. 安全最佳实践建议
除了完成上述的安全保障步骤外,还有一些安全最佳实践建议可以进一步提升应用程序的安全性:
- 定期更新证书 :SSL证书有有效期,定期更新证书可以确保应用程序始终使用有效的证书,避免因证书过期导致的安全问题和用户信任问题。
- 监控安全日志 :定期查看CloudFront、ELB等服务的安全日志,及时发现异常访问和潜在的安全威胁。可以设置日志监控和报警机制,当出现异常情况时及时通知管理员。
- 使用强密码和多因素认证 :对于IAM用户,使用强密码并启用多因素认证可以增加账户的安全性,防止账户被盗用。
- 限制访问权限 :根据用户的角色和职责,合理分配权限,避免给予不必要的高权限。定期审查用户权限,及时撤销不再需要的权限。
12. 未来安全趋势与展望
随着技术的不断发展,应用程序安全面临着新的挑战和机遇。未来,以下安全趋势值得关注:
- 零信任架构 :零信任架构基于“默认不信任,始终验证”的原则,对任何试图访问应用程序的用户、设备和网络进行严格的身份验证和授权。这将有助于应对日益复杂的网络攻击。
- 人工智能和机器学习在安全中的应用 :人工智能和机器学习技术可以用于分析大量的安全日志和数据,及时发现潜在的安全威胁和异常行为。通过智能算法的学习和预测能力,提高安全防护的效率和准确性。
- 量子加密技术 :量子加密技术利用量子力学原理提供更高级别的加密安全性。随着量子计算技术的发展,传统的加密算法可能面临被破解的风险,量子加密技术有望成为未来保障数据安全的重要手段。
通过不断关注和适应这些安全趋势,我们可以更好地保障应用程序的安全,为用户提供更可靠的服务。
通过以上全面的安全保障流程、常见问题解决方案、安全最佳实践建议以及对未来安全趋势的展望,我们可以更系统地保障应用程序的安全,确保数据在传输和存储过程中的安全性和完整性。希望这些内容对你有所帮助,让你在应用程序安全领域迈出更坚实的步伐。
超级会员免费看
2669

被折叠的 条评论
为什么被折叠?



