在设计到保密数据传输的时候我们通常会使用GPG或者PGP软件来进行加密传输,这时候我们需要用到密钥对来进行加解密
用密钥对中的公钥进行加密。
用密钥对中的私钥进行解密。
以往我们通常手工生成一对密钥对,但是在某些时候我们需要大量或者用户自助申请密钥对。
经过大量思考,终于绕来绕去搞定了。
由于个人技术有限,使用了很多绕弯的方法,如有不足,请多包涵
1、先做一个简单的页面
使用html实现
<!DOCTYPE html>
<html>
<title>Make GPG key By yourself </title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<body>
<hr></hr>
<b>Please input your message!</b><br />
<form action="./getinfo.php" method="POST">
Name : <input type="text" name="username"><br />
Please input your name!<br />
Email : <input type="text" name="email"><br />
Your must input mail address like [email protected] <br />
password: <input type="password" name="passwd"><br />
Your must remeber this passwd !!!!<br />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>
上面的代码实现了一个简单的申请界面,输入用户名,邮箱地址,和秘钥密码
然后新建一个getinfo.php的文件,来接收这些发送的信息
<?php
$name=$_POST['username'];
$mail=$_POST['email'];
$passwd=$_POST['passwd'];
$output=shell_exec("sudo ./mkinfo.sh $name $mail $passwd");
echo $output;
?>
上面是一段PHP的代码,里面使用了shell_exec调用mkinfo将接收的信息直接生成一个文档模板。
如果你想调用shell_exec这个参数,请自行百度或者谷歌。默认PHP似乎没有开启
mkinfo.sh的代码内容如下
#!/bin/bash
name=$1
mail=$2
pass=$3
echo "Key-Type: 1" >> ./userinfo/$name
echo "Key-Length: 2048" >> ./userinfo/$name
echo "Subkey-Type: 1" >> ./userinfo/$name
echo "Subkey-Length: 2048" >> ./userinfo/$name
echo "Name-Real: $name" >> ./userinfo/$name
echo "Name-Comment: GPG key for $name" >> ./userinfo/$name
echo "Name-Email: $mail" >> ./userinfo/$name
echo "Expire-Date: 1y" >> ./userinfo/$name
echo "Passphrase: $pass" >> ./userinfo/$name
echo "Please wait email"
echo "We will send your Keys to you mailbox"
echo "This sign key will send to you in 1 hour"
这段脚本的目的是在 当前目录下的userinfo目录下生成一个对应用户名的文件,生成一个具体模板
这样,我们对生成GPG秘钥的基本信息已经获取到。
我们需要写一个定时脚本来生成GPG秘钥,脚本名字我这边定义为mkgpg.sh。
#!/bin/bash
ls /绝对路径/userinfo|while read line ##逐个获取用户信息
do
mkdir -p /绝对路径/email/$line ##生成秘钥存放路径
gpg --batch --gen-key < /绝对路径/userinfo/$line ##生成秘钥
gpg -a -o /绝对路径/email/$line/$line"_pubkey.key" --export $line ##导出公钥
gpg -a -o /绝对路径/email/$line/$line"_own.key" --export-secret-keys $line ##导出私钥
email=`cat /绝对路径/userinfo/$line |grep Email|awk -F ": " '{print $2}'` ##获取邮件地址
passwd=`cat /绝对路径/userinfo/$line |grep Passphrase|awk -F ": " '{print $2}'` ## 获取密码
echo $passwd > /绝对路径/email/$line/passwd.key ##保存密码
rm -rf /绝对路径/userinfo/$line ##删除个人信息
/绝对路径/email/email.sh $email /绝对路径/email/$line/$line"_pubkey.key" /绝对路径/email/$line/$line"_own.key" $line"_pubkey.key" $line"_own.key"
done
## 最后这段是一行,邮件发送
最前面是逐个读取userinfo下的个人申请生成的模板。将这些模板内容逐个提取并生成gpg秘钥。
将生成的秘钥保存在当前目录下email目录下的创建的对应用户名目录下。
生成秘钥后,将个人信息直接删除。
将这些秘钥导出,然后以邮件的形式发送到用户邮箱中。
使用sendmail发送邮件,脚本如下
#!/bin/bash
email=$1 ##接收人邮箱
pubkey=$2 ## 公钥路径
ownkey=$3 ##私钥路径
pubname=$4 ##公钥名
ownname=$5 ##私钥名
from_name="GPG Key Center"
from="发送邮箱"
to=$email //接收人邮箱
cc_name="GPG Key Center"
cc="抄送邮箱"
email_title="YOUR GPG KEY"
email_content="/绝对路径/email/email.content" ## email.content文件内是邮件的具体内容,我这边写了秘钥用法
email_subject="Pleast take care of your key"
attachment=$pubkey
attachment1=$ownkey
(echo -e "To: \"${email_title}\" <${to}>\nCc: \"${cc_name}\" <${cc}>\nFrom: \"${from_name}\" <${from}>\nSubject: ${email_subject}\n\n`cat ${email_content}`";uuencode ${attachment} $pubname;uuencode ${attachment1} $ownname) | /usr/sbin/sendmail -t
最后将mkgpg.sh设置为定时执行即可。。。
最后生成的邮件内容大致如下
总结:设置这些,你需要考虑php执行函数的问题,bash脚本执行权限问题,是否需要将apache用户设置到suduer并设置nopasswd形式。
仅供参考,不喜勿喷!