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

环境管理 0 862 张长瑞 收藏

在设计到保密数据传输的时候我们通常会使用 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  xxxx@xxxx.com <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/bashname=$1mail=$2pass=$3echo "Key-Type: 1" >> ./userinfo/$nameecho "Key-Length: 2048"  >> ./userinfo/$nameecho "Subkey-Type: 1" >> ./userinfo/$nameecho "Subkey-Length: 2048" >> ./userinfo/$nameecho "Name-Real: $name" >> ./userinfo/$nameecho "Name-Comment: GPG key for $name" >> ./userinfo/$nameecho "Name-Email: $mail" >> ./userinfo/$nameecho "Expire-Date: 1y" >> ./userinfo/$nameecho "Passphrase: $pass" >> ./userinfo/$nameecho "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/bashls /绝对路径/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/bashemail=$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=$pubkeyattachment1=$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 形式。

仅供参考,不喜勿喷!


相关推荐:

网友留言:

您需要 登录账户 后才能发表评论

我要评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
验证码