|
2001-12-20 microsoft
/ [2 {+ h% y! y2 T$ |
% p& @- n5 ?' K9 n* V
9 B+ d C+ d o* g$ U- [. c 如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。 0 w- x/ ^% U2 Y/ N
! _1 j' v" R/ @9 Q9 P/ y 创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。 . T+ g9 w! S- j% W4 F
5 m: D, S( ]8 J% i! W* f- X 在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。
% l2 {% S7 c( ]. F2 t0 t+ A4 `9 H9 w# v; i3 E0 q
下面是创建签署CAB文件的步骤 : - g5 y0 {" M7 T7 j% o) q4 j5 E
/ V; ^) c3 w! ?$ i9 j, j+ f
1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用) - F% X& V0 r& S/ B
' ~! [5 R2 p, ]: D0 B 2 创建 CAB 文件
4 C0 A) ?/ o0 w" U2 _$ [; `3 S1 j/ `0 @6 i2 I% w+ A
3 签署您的文件
1 C9 _6 D5 } M' C( k" m0 z% ~0 ^9 O. D$ s* {3 b: I
4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书 z, u. A u" E) @
! W( |* a3 d2 z( {, I' l' X 在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。 4 U x5 H7 G. a2 K
5 c& d: b5 R; f! K" g 有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate. B7 C6 d3 g! N; O% |
9 [9 L$ e4 h9 H$ k( T! y0 B* u( h) n 证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。
4 {( o* \3 l0 ^0 |# P8 D l
" q9 c* M) b+ Y9 q. G/ |! [ 获得一个软件出版商证明书% u. F$ |( R9 N0 j n& F+ @6 I
) c7 f) V# ~+ |9 m 您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。 - G! d9 Z, u5 [' R% e% J, X
4 @+ X8 m" m) I- ? 比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下:
0 F2 ]6 T+ ^$ M: U; J# x+ e0 s% G. ?: y
C:\CAB&SIGN\MAKECERT
! C8 i( X; U1 J3 M. O1 L( n3 f1 N-u: MyKey + C4 S0 T0 y$ s! L$ @
-n: CN = MySoftwareCompany
# [: P- V) J1 B2 t% h5 j7 e-k: MYKEY.PVK CERT.CER
' x7 A7 W% z# {; r6 G' P0 O" w+ }: P& h0 {
MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。
5 A. q$ \ J& y+ B) Q
+ k- j- \% d# n9 H% m# L 做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下: 8 l4 T6 X% r4 ~8 Y
" N% X% {* M+ ]- ]
C:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC ' [$ y' L$ C1 W$ J( F
" o# o5 C+ w" ?) a2 a4 m
注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。
& C3 O+ c9 e4 f- \) w1 a5 S/ K, G6 h! r5 H
创建一个 CAB文件
6 O# V @$ p- \9 s) g( r$ z
+ k" Q- m9 J& T 这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。
( P) j3 U( m9 n/ p7 G: i/ O _. Q* C" y9 g
创建一个 CAB文件: 8 v; e' ~/ B; t
- ? Y2 `, H* T# m
创建一个INF文件。 " {; Y5 c% e7 I2 n+ ~6 q! T
% g9 V3 t) V) Y4 C4 Q! O
运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如:
* w& w C2 v$ Q, }. r7 N3 |4 }9 B$ Q* t+ V) X' u+ b$ c# u9 o
C:\CAB&SIGN\CABARC -s 6144
% d8 G# C3 Y! J+ r4 R. e$ T/ rn MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF
0 C( H2 f$ _* }
6 C5 `6 ?% n' r8 J2 _ CABARC 创建了一个名为MYCTL.CAB的CAB文件。 ' {% _6 W4 F u% {' y* C
0 M& I- I! ?. U. G( E 您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。
0 i- @# M) `7 d, C; f8 Z/ W( w% z
-s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC: 3 {$ E. E0 L+ X( J: p
$ H4 p$ h; Q# }" c# l C:\CAB&SIGN\CABARC 6 o$ D9 B% s" {- E0 g0 i8 ?3 ^% T1 ?" s2 @! T
" N; y( p( \" R 创建一个INF文件' |' L1 M: X$ F
6 `; V) j5 s8 h9 N# k4 H9 o0 G
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目录下的内容。 - O; s% s3 }" {" E2 Z
* `4 y+ f2 u4 q0 A
作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。 5 F" }* Z+ p# v0 z Y
& l9 M$ e3 q, k2 R8 d9 J; Sample INF file for POLYGON.DLL
0 d6 T5 a1 r) U[version]
4 P! j9 i) a+ E. Z% p4 \; version signature (same for both NT and Win95) do not remove
3 d( ~* E1 R' I# l. I% x) W. [signature="$CHICAGO$"+ k# u8 `) g" ?0 V
AdvancedINF=2.0
5 `) H$ m8 j- N. ?2 u2 l! R
& m% f. r/ F0 L[Add.Code]+ s( o$ s6 _" }* w5 H
polygon.dll=polygon.dll
- N% E" Q3 H& o; uatl.dll=atl.dll+ l* I2 r. i( @- R3 t
5 L x: [7 P- t1 N, e
; needed DLL
' ]- g: n' ^9 K2 Y: A1 C" ?[atl.dll]
/ D4 J+ c" e, H+ h; R4 |file-win32-x86=thiscab
/ @+ i3 [4 M4 z9 ^( W* j& W/ wFileVersion=2,00,0,7024+ h, n. J) E+ O; _
DestDir=11- U: l A7 b" N. \6 U
RegisterServer=yes
' O) Z$ f8 U1 n4 t# j4 y, v# u
1 e; o: c+ f/ n2 F O9 q5 `[polygon.dll]
6 x7 v8 k. [7 B: jfile-win32-x86=thiscab
6 o# j2 L( ]! Y& z) g9 i* K4 @1 rclsid={4CBBC676-507F-11D0-B98B-000000000000}
/ O7 m/ e6 k: L" @FileVersion=1,0,0,1 ' ^) g8 X1 G4 j+ o9 a, |
RegisterServer=yes
) O; K, x2 S, \2 t0 {5 u; end of INF file
+ P7 N: Q8 u: x; U/ U( _/ Y+ D0 J$ @" p' p5 ^0 A/ }4 v
该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如:
7 S- E) G) d+ o, H6 ]7 Q5 D: t
/ `& @* n" h! K8 L file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL 0 o& X6 E" n4 ^5 e% b$ n0 F
* e* Q. i: j0 W8 h- O% U9 f
关键字"file-win32-x86" 指定平台是 x86。 % S' `- a/ I* e1 b6 N
6 H/ g7 s: O! N$ E4 ^
得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。
6 g, e: P. e+ r* R& p' Z
6 R% Z/ O. r" Q1 a6 p# l "DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。
$ d3 s( G( b; D4 R. t& f" a b) ]2 H I; i2 |2 R
"clsid" 指的是要安装控件的CLSID。 5 N' s8 \3 Q& f0 ?
7 L1 `% r) x2 v& C 创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 :
! }# `7 c0 k+ f$ J* _ x. K( W' D/ c
C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF
1 Z% v% ]7 {; `* }! l4 ^3 H. @7 o5 x; D; t
该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。
6 L3 I+ G: P7 H. r8 ?# x$ Z0 K- K# t! y
有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。 9 j) g5 q2 W: h3 c6 m6 O* O. y
, G4 W! [ @7 @ 签署一个CAB文件
$ c3 u) O9 ~% r7 f3 q7 S" @- ?+ N/ A; I8 D3 b
使用Code Signing Wizard签署一个CAB文件: " P3 v$ O" n7 z# a* W- z
% g& Z& g R* {5 N6 N+ U7 R 1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。
& Z: }5 J' e2 C7 u* g. U2 l4 ]
% A S5 C4 |$ O) H# q/ Y3 c C:\CAB&SIGN\SIGNCODE/ F: U. d9 I! [% P' y
) O# A# v$ m. r. p
2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。 + ^/ i* \ B/ f6 }% ^
) M8 e' L: n, x( Y2 P5 ?1 k
3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。 ) O/ F. @, E+ E
; N" F/ h$ N$ s6 O
4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。
/ L0 ` ~$ M0 s) S( e; K' Y. T% x K
9 I5 c) l; |( r' A2 X) _) A# z8 z
/ y8 T7 E9 c7 j! q& r G! C1 ` 5. 点击Next,前进到下一页。
4 h+ g& K" ]/ m. C
) F4 V! U# h; N }& m; e 6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。 1 P' {) c0 j" t/ D9 S
0 L: M2 \/ I1 a7 Z( M 7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。 # j W2 _: X( ^/ |
5 a0 N, b" ^( S1 w, j* {6 S
8. 连续两次点击 Next前进到最后一页。
# |% v# q- o8 |! y1 V1 D( t1 m. i$ t4 `8 x# A( Y0 [7 \
9.点击Sign,签署CAB 文件。您的文件将被数字化签署。 ( R& u" u, i# {+ s u
) A7 g A( l# ?1 ~
您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。
- {% p; c& }+ k* ~6 ^8 T& Z5 O- o$ l" ~9 ~
将签署过的 CAB文件嵌入一个Web页
" A( K$ h; Z) I+ \0 O X0 S; r4 X: {2 ~ M
ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 :
z6 `0 P% d8 }
2 E" ^5 R. h0 ` ID - 控件名称
6 Q3 P, U* Z/ ~- @/ Q% W/ X% l
2 Y1 p# l. z2 i/ c5 r9 U CLASSID - 控件的CLSID ' C& _( f/ O4 W k
j5 a; S, Q. z" l1 y5 l. L CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。 3 h# X5 H( a3 W- f
+ L7 R3 D. S& G, [5 G
CODEBASE可以直接指向一个OCX 文件或者DLL文件: ) }8 J U4 F$ u. g4 v
0 a' Z- E1 c4 W/ |7 E8 lCODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1"
0 O# d% c% S7 k {! D4 Q
( b- t7 X& H) C3 { P# g 因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。 - v; Z7 r X) m. v, M6 B6 o
- c* {$ b& _8 h) z+ }1 h7 b( a
如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1: % t4 S5 E4 p: m% R# j8 Y$ i m5 L
% l( N5 g$ _6 b) j8 L6 @CODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1"
( j; h H, j* U. @+ n$ A6 g! P6 R
- f, d4 A; S# j, B3 o' b 如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。 |
|