|
|
2001-12-20 microsoft
* P7 E$ j9 m5 o) {. [1 F8 T, [# E1 Z) {7 n. T/ W
$ {, n" y3 N% w8 T" u+ |
如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。 ' M0 i$ n5 c/ E1 P" E
4 S: @. Y9 a W! O+ L7 N( _
创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。 1 V5 G$ m2 ]8 J: G- R- f O) O9 @7 i7 H
! D) y p5 h4 w+ U& g
在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。
9 }! M& Q9 ?* t" ^; Y" ?0 _
7 s6 X7 v6 A- k 下面是创建签署CAB文件的步骤 : 9 s3 l7 n7 d" y }8 {
) v! S+ @) n% l6 @2 t7 ~% y
1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用)
- K h; p- ^, Y% b
) V6 e& h* \6 d: R 2 创建 CAB 文件 5 u9 |/ \* \4 i) E; U
+ Z. i3 x2 Z6 ?5 y
3 签署您的文件
& X/ j h- p- e1 w
+ i; p+ i, i2 L2 H 4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书
8 d% _! R/ R" g: f, s
/ |" r1 S' g0 y3 z/ |! @, ?/ L5 A 在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。
& H0 Y- G, P$ ~" |% O7 L/ _6 `) f1 x* h
有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate.
% {* p2 n' {0 e! `! [+ {9 E- T1 J3 v7 i
证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。
$ V& [- ^0 A6 y1 C; M* Y# A7 h1 U( n" i2 D9 r/ |( ]# a, _; W% D
获得一个软件出版商证明书
0 [: ]0 H9 [# Z4 f% r4 g& h/ w( q, t0 v1 P5 K
您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。 ! ~ f3 R: M. [; x$ ]
/ @$ P) z) I0 s5 h- u1 P
比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下: ) l ~ r" i. X% G& Q, E
2 H( Q! q6 _9 |6 z0 [! E; X
C:\CAB&SIGN\MAKECERT 6 c# Y$ F2 D, z; w
-u: MyKey . `' I4 x6 n& r$ f
-n: CN = MySoftwareCompany ; ^/ ?( ?# n; r- M8 S
-k: MYKEY.PVK CERT.CER
+ Y4 R% M' A' t( G0 [
/ |$ A$ n; }% L" c8 a MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。
, ~/ T) Z% x6 T! {* U9 O; u' r/ @1 _7 A$ G
做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下: , W6 U# _: c5 b. b, o- x9 K2 k
5 I; z1 p! b( ]/ c8 }2 I2 vC:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC & B/ c. h3 }) Q1 f: }" t
. m: p2 Q( Z1 x
注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。
+ f2 R% X; x) M" |+ R! O" \# @+ @/ {% V! f. }$ x3 y
创建一个 CAB文件7 P& d' D2 J, F5 l1 {
3 {( j+ t4 J5 p P& Q4 a 这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。
& T( Z" \: D* O: w0 {. U4 o) Q' w) @& k2 \
创建一个 CAB文件:
" y, v g/ H. N' d- Z5 [' O
6 o! ]' B2 E' J% x; M9 ` 创建一个INF文件。 + u4 K+ j5 E2 J
7 j# u o4 s8 {) a; |4 R* E1 ^
运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如: * M. ]1 l$ F1 I$ g A. y, A2 v
5 z2 e# [( \9 B' j7 UC:\CAB&SIGN\CABARC -s 61442 T7 V" K6 q) Q6 P; A8 V* @( w. o
n MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF ; E' @( F/ B& C9 k+ Y0 d
* x, O! N9 g, Y) `
CABARC 创建了一个名为MYCTL.CAB的CAB文件。 ) j1 Q, Z# T: S
7 o6 ~5 b. C8 q& L4 H6 M
您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。
& s6 N& F1 q% N+ ?* {. T; E1 \& p+ \
-s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC:
7 B; E6 Z# v- z \) n3 ?/ ]! d" z
+ `$ v! I1 z1 e3 m* i Q1 R C:\CAB&SIGN\CABARC
& \4 [# l9 t: H. F& ]
. X5 U5 `$ N) T; I1 r. D 创建一个INF文件
0 V$ o0 H1 M, }5 w6 t0 J0 Z
* p" @4 G. M- W5 r( U/ V6 V INF文件是一个文本文件,指定运行控件所需要下载或者呈交的文件(比如DLL或者其它OCX)。一个INF文件就捆绑了CAB压缩文件所有的必须文件。 缺省情况下,与现有硬盘中文件版本号相同的文件不被下载。要了解有关INF文件及其选项(包括如何创建独立于平台的INF文件)的详细情况,请参考万维网站Packaging Component Code for Automatic Download,或者参考平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\INF Files目录下的内容。
# F0 N9 w% c2 Y( I) d1 X8 T6 D7 w2 X: x" k4 t: Z
作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。
' o/ ?, \% l, J2 w; J+ x$ R9 `4 @9 D+ @, q8 r
; Sample INF file for POLYGON.DLL
4 ]+ U! B6 _' ^* D+ P" N[version]
, Z* _9 [1 o- v& J6 j6 A5 o1 }; version signature (same for both NT and Win95) do not remove
& {3 F4 g( r# F( Lsignature="$CHICAGO$"8 Q9 S9 \! i" a1 C+ d W; Q* K
AdvancedINF=2.08 T: u7 E. k- q! D5 y/ k
# C* F( M% b6 V1 V! x# l, K- P[Add.Code]$ P# K$ h6 E$ _' `, E
polygon.dll=polygon.dll
m3 Z0 |5 V0 B" d- E# Satl.dll=atl.dll& y5 g) J6 v% a3 j2 o0 c' _+ }8 [
S( t$ k3 i% Z4 ]/ ^
; needed DLL
: z3 v# G2 _1 E/ p[atl.dll]; e5 o G7 O' X' C, n' K$ W
file-win32-x86=thiscab3 y; i0 e) h! A7 W: L3 |
FileVersion=2,00,0,7024
9 g; r0 ^/ j' Y3 cDestDir=11
G* U/ @+ Z: Y5 v1 ^, U5 zRegisterServer=yes
2 B$ m+ K$ v9 L. x: h# s$ y7 y- H% z8 q
[polygon.dll]
% [7 ?, e7 @: z W1 [3 Qfile-win32-x86=thiscab6 g6 i( c+ l( `8 I: v
clsid={4CBBC676-507F-11D0-B98B-000000000000} 8 M( _; w9 U, @- L k9 T
FileVersion=1,0,0,1
/ p" ]1 z& d- p4 |8 ~ @RegisterServer=yes" d: p1 w5 `. o/ q5 Z% N
; end of INF file
) ^+ Z; L- A$ V N2 z1 T+ o8 C9 o& N& N- J
该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如:
$ n0 P0 r% v, x8 m5 B3 L8 Q5 A. I8 x# `4 b0 i' a6 ?: {2 H* g
file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL 3 n& ^- d Y* z* g5 b' i' U
B: e1 L* Y6 D9 m$ l# U# j/ ?
关键字"file-win32-x86" 指定平台是 x86。 4 J0 `: m x5 ^1 t1 X; X& {
2 u4 t8 E6 U1 M M! @% I 得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。 " S8 [& q; p: k
, v n! s0 j: G "DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。 , H9 W8 M. f- F; d
& t6 H+ M7 z. d# C
"clsid" 指的是要安装控件的CLSID。
* @ I+ x& b( p! Y ?6 r
/ ?( u0 _# V, ? Q; `; G 创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 :
" @6 G" f( K3 H9 j" ?; R/ B3 i9 d! J7 A& Q: F
C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF0 l* U. @! j) F% o8 _2 b
7 P* _: I) M* _. A' O) s
该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。
4 g; m0 U, S' \# _; m- ~4 [
% f. m2 m$ K) d1 j5 s7 h 有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。
( T5 I$ p& L1 f, M& A! b b
/ _( j! W+ Z6 A& M1 N: Z* a. F 签署一个CAB文件* {% t4 Y% e- p# A, m& F) W3 u* S
3 S- z4 x. E5 T& {
使用Code Signing Wizard签署一个CAB文件: * M- D+ n5 H( { H: {+ F- K
9 b0 M# R! _9 M7 ]! B2 v7 d( ]
1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。
; c2 w# P ?6 i7 V$ J2 J8 i# ~* f' }8 b1 @& o2 [ C- [
C:\CAB&SIGN\SIGNCODE) c4 j) y$ e {2 ?9 G+ Y
9 q- f C9 S% _
2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。
& a# P7 i7 |( t
9 B% E: H( {+ Z! a( K 3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。
0 P/ }: D/ \/ Y
; b5 _5 x: U; Y' K6 E 4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。
. q6 ^& K' _) e- |6 j. d" X* D
# o+ ^% c. @# z. K5 e& J. P2 d5 a4 E+ d
5. 点击Next,前进到下一页。 2 p7 M/ W/ L: \ L% |
3 v$ t! u( K! E6 Q C
6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。
9 ^, s4 d7 n0 o& e& @7 H9 F0 P. t" V; A5 F$ N4 u0 _; ?! O
7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。
8 B. ~. l: ]5 N% p& W' b! T1 s2 J7 e: E0 ? w2 K
8. 连续两次点击 Next前进到最后一页。
. J" Q; t7 G( m$ a/ @9 O" G+ L5 l- z% w( R( C; O; F) j( S
9.点击Sign,签署CAB 文件。您的文件将被数字化签署。
% X/ D- _6 f6 N% ?: }
6 d7 W4 P" G9 B A5 x9 H6 e+ k 您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。 5 P7 _% L7 P8 w* i
+ s; m( _2 p1 |# c3 ?! Q
将签署过的 CAB文件嵌入一个Web页
! q6 U3 v) _, L& ~/ k a C
6 h# d# B0 I4 {, u+ `2 H; o+ [( w5 l4 d e ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 :
8 y' }4 ?: X: D2 o$ s/ L; G
# Q2 W. x$ x2 P ID - 控件名称 & D" V7 o! t% @: C. u
* c# I( V# Z3 p# ?! h' h
CLASSID - 控件的CLSID
( M# U% i% p: Y, o D
6 ]0 D* r" J' }: K CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。 / p% i' Y! l7 t4 O% @0 v
1 p8 `* P3 |% J: \! t7 m0 M' U
CODEBASE可以直接指向一个OCX 文件或者DLL文件: - E0 v$ O7 I6 p0 E/ H
/ {+ \3 {4 z4 i t* wCODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1"
8 z$ ^2 W% q2 F) F6 j
6 z' z( U) @: a7 W6 z Z) ` 因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。
$ A" \4 I% ?* Q7 u; z3 c! h9 ]& W: q
: ?5 x2 ?1 q* ]6 u; v 如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1:
0 |4 R2 Y6 i3 R5 S7 B% o: n7 W% F" I( C+ G1 U; U
CODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1"
: ^8 S3 t' i* z* V+ O/ Z3 m# }3 N
7 H# F P) M; ^9 M+ M0 ^ 如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。 |
|