在设计到保密数据传输的时候我们通常会使用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设置为定时执行即可。。。

最后生成的邮件内容大致如下

简单实现关于GPG密钥对自助生成-LMLPHP

总结:设置这些,你需要考虑php执行函数的问题,bash脚本执行权限问题,是否需要将apache用户设置到suduer并设置nopasswd形式。

仅供参考,不喜勿喷!

06-24 22:31