分享
 
 
 

对等计算实践:P2P遇上SSL

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

对任何重要的 P2P 应用程序而言,对等机之间的安全通信都是一个核心要求。尽管安全的细节依赖于如何使用该应用程序和该应用程序将要保护什么,但通过使用现有技术,例如 SSL 实现强壮的、一般用途的安全通常是可能的。本月,Todd Sundsted 演示如何在 P2P 安全中使用 SSL(通过 JSSE)。

上月我们考察了 p2p 应用程序中的信任角色。信任的等级是衡量我们确信程度的尺度,即我们正与之通信的人是否是我们以为的那个人,以及我们正访问的资源是否是我们以为的那些。我们也研究了用于在所有分布式应用程序,包括 p2p 应用程序中建立信任的三个构件:认证、授权和加密。

现在我们将通过修改我们的简单 p2p 应用程序把上个月的课程应用到实践中。特别地,我们将用 X.509 证书扩展该应用以支持 P2P 认证和加密。我们将在将来的文章中处理授权问题。

安全认证

一个应用程序的安全需求在很大程度上依赖于将如何使用该应用程序和该应用程序将要保护什么。不过,用现有技术实现强大的、一般用途的安全通常是可能的。认证就是一个很好的示例。

当顾客想从 Web 站点购买某个产品时,顾客和 Web 站点都要进行认证。顾客通常是以提供名字和密码的方式来认证他自己。另一方面,Web 站点通过交换一块签名数据和一个有效的 X.509 证书(作为 SSL 握手的一部分)来认证它自己。顾客的浏览器验证该证书并用所附的公用密钥验证签名数据。一旦双方都认证了,则交易就可以开始了。

SSL 能用相同的机制处理服务器认证(就如在上面的示例中)和客户机认证。Web 站点典型地对客户机认证不依赖 SSL ? 要求用户提供密码是较容易的。而 SSL 客户机和服务器认证对于透明认证是完美的,对等机 ? 如 p2p 应用程序中的对等机之间一定会发生透明认证。

安全套接字层(Secure Sockets Layer(SSL))

SSL 是一种安全协议,它为网络(例如因特网)的通信提供私密性。SSL 使应用程序在通信时不用担心被窃听和篡改。

SSL 实际上是共同工作的两个协议:“SSL 记录协议”(SSL Record Protocol)和“SSL 握手协议”(SSL Handshake Protocol)。“SSL 记录协议”是两个协议中较低级别的协议,它为较高级别的协议,例如 SSL 握手协议对数据的变长的记录进行加密和解密。SSL 握手协议处理应用程序凭证的交换和验证。

当一个应用程序(客户机)想和另一个应用程序(服务器)通信时,客户机打开一个与服务器相连接的套接字连接。然后,客户机和服务器对安全连接进行协商。作为协商的一部分,服务器向客户机作自我认证。客户机可以选择向服务器作或不作自我认证。一旦完成了认证并且建立了安全连接,则两个应用程序就可以安全地进行通信。请参阅参考资料以获得更多有关 SSL 的信息。

按照惯例,我将把发起该通信的对等机看作客户机,另一个对等机则看作服务器,不管连接之后它们充当什么角色。

在 Java 应用程序如何使用 SSL

用于 Java 应用程序的 SSL 由“Java 安全套接字扩展”(Java Secure Socket Extension(JSSE))提供。JSSE 是最近发布的 JDK 1.4 Beta 测试版的一个标准部件,但对早些版本的 Java 平台它是作为一个扩展可用的。

JSSE 用 SSL 作它的安全套接字的底层机制。JSSE 安全套接字除了支持透明认证和加密之外,其工作方式与常规套接字相似。因为它们看起来也与普通套接字(它们是类 java.net.Socket 和类 java.net.ServerSocket 的子类)相似,所以使用 JSSE 的多数代码不用修改。受到影响最多的代码是那些处理安全套接字工厂(secure socket factory)的创建和初始化的代码。

如果您想在早于版本 1.4 的 Java 平台中使用 JSSE,那么您将不得不自己去下载并安装 JSSE 扩展(请参阅参考资料)。安装说明非常简单,所以我不想在这里重复。

名为 A 和 B 的两台对等机想安全地进行通信。 在我们简单的 p2p 应用程序的环境中,对等机 A 想查询对等机 B 上的一个资源。

每个对等机都有包含其专用密钥的一个数据库(名为 keystore)和包含其公用密钥的证书。密码保护数据库的内容。该数据库还包含一个或多个来自被信任的对等机的自签名证书。

对等机 A 发起这项事务,每台对等机相互认证,两台对等机协商采用的密码及其长度并建立一个安全通道。完成这些操作之后,每个对等机都知道它正在跟谁交谈并且知道通道是安全的。

初始化

因为 JSSE 和 SSL 的介绍对初始化代码有很大影响,所以让我们来考察对等机 A 中负责初始化的代码。

清单 1. 安全初始化代码

// Each peer has an identity that must be locally (but not globally)

// unique. This identity and its associated public and private keys

// are stored in a keystore and protected by a password. Each

// peer also has a name that must be globally unique.

String stringIdentity = null;

String stringPassword = null;

String stringName = null;

// The code that prompts the user for his/her identity

// and password goes here. the user´s name is

// generated (if necessary) later.

// Create home directory. This is a very portable way

// to create a home directory, but it has its problems --

// the various flavors of Microsoft Windows put the directory

// in widely different locations in the directory hierarchy.

String stringHome = System.getProperty("user.home") + File.separator + "p2p";

File fileHome = new File(stringHome);

if (fileHome.exists() == false)

fileHome.mkdirs();

// Create keystore. We must run an external process to create the

// keystore, because the security APIs don´t expose enough

// functionality to do this inline. I haven´t tested this widely enough

// to know how portable this code is, but it works on everything I

// tried it on.

String stringKeyStore = stringHome + File.separator + "keystore";

File fileKeyStore = new File(stringKeyStore);

if (fileKeyStore.exists() == false)

{

System.out.println("Creating keystore...");

byte [] arb = new byte [16];

SecureRandom securerandom = SecureRandom.getInstance("SHA1PRNG");

securerandom.nextBytes(arb);

stringName = new String(Base64.encode(arb));

String [] arstringCommand = new String []

{

System.getProperty("java.home") + File.separator + "bin" + File.separator + "keytool",

"-genkey",

"-alias", stringIdentity,

"-keyalg", "RSA",

"-keysize", "1024",

"-dname", "CN=" + stringName,

"-keystore", stringHome + File.separator + "keystore",

"-keypass", stringPassword,

"-storetype", "JCEKS",

"-storepass", stringPassword

};

Process process = Runtime.getRuntime().exec(arstringCommand);

process.waitFor();

InputStream inputstream2 = process.getInputStream();

IOUtils.copy(inputstream2, System.out);

InputStream inputstream3 = process.getErrorStream();

IOUtils.copy(inputstream3, System.out);

if (process.exitvalue() != 0)

System.exit(-1);

}

// Once the application has created/located the keystore, it

// opens it and creates a KeyStore instance from the data

// in it.

char [] archPassword = stringPassword.toCharArray();

FileInputStream fileinputstream = new FileInputStream(stringHome + File.separator +

"keystore");

KeyStore keystore = KeyStore.getInstance("JCEKS");

try

{

keystore.load(fileinputstream, archPassword);

}

catch (IOException ioexception)

{

System.out.println("Cannot load keystore. Password may be wrong.");

System.exit(-3);

}

if (keystore.containsAlias(stringIdentity) == false)

{

System.out.println("Cannot locate identity.");

System.exit(-2);

}

// Create key manager. The key manager holds this peer´s

// private key.

KeyManagerFactory keymanagerfactory = KeyManagerFactory.getInstance("SunX509");

keymanagerfactory.init(keystore, archPassword);

KeyManager [] arkeymanager = keymanagerfactory.getKeyManagers();

// Create trust manager. The trust manager hold other peers´

// certificates.

TrustManagerFactory trustmanagerfactory = TrustManagerFactory.getInstance("SunX509");

trustmanagerfactory.init(keystore);

TrustManager [] artrustmanager = trus

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有